Трафик пользователей
Ядро считает трафик каждого пользователя входящего — пары «имя входящего» + «пользователь», как их видят правила IN-NAME и IN-USER. Учитываются соединения с авторизованным пользователем: VLESS, Trojan, Hysteria2, TUIC, AnyTLS, Shadowsocks с несколькими пользователями, SOCKS/HTTP с паролем и другие. Соединения без пользователя (TUN, redir, анонимные входящие) не учитываются и почти ничего не стоят.
Что считается
Заголовок раздела «Что считается»upиdown— байты полезной нагрузки, которыми пользователь обменялся с адресатами, на исходящей стороне туннеля. Это те же байты, что в общих счётчиках/trafficи в/connections. Накладные расходы входящего протокола (TLS, заголовки VLESS/Trojan, кадры mux, TCP/IP) не входят.- Подпотоки mux (sing-mux, XUDP) относятся к пользователю соединения, которое их несёт.
conns— открытые сейчас соединения (TCP) и UDP-сессии пользователя.ips— адреса, с которых пользователь подключён: число соединений с адреса и время последнего подключения или отключения. Адрес остаётся в списке минуту после закрытия последнего соединения.lastActive— последняя замеченная активность (открытие или закрытие соединения, движение байтов при запросе); точность — до минуты.rejectedиrejectReasons— сколько соединений отклонили лимиты пользователя, всего и по причинам (expired,quota,max-conns,max-ips).
Счётчики живут в памяти и обнуляются при перезапуске ядра.
user-stats: true # по умолчанию; false — новые соединения не учитываютсяЗапросы идут к external-controller с тем же secret, что и остальной API.
GET /traffic/users
Заголовок раздела «GET /traffic/users»Параметры (все необязательные):
| Параметр | Значение |
|---|---|
inbound |
Только этот входящий. |
user |
Только этот пользователь. |
reset=true |
Вернуть байты с прошлого сброса и начать новый период — «запрос со сбросом», как в Xray. Сбрасываются только отфильтрованные пользователи; ни один байт не теряется и не попадает в два ответа. |
Без reset up и down накопительные с момента появления счётчика.
curl -H "Authorization: Bearer $SECRET" "http://127.0.0.1:9090/traffic/users?inbound=vless-in&reset=true"[ { "inbound": "vless-in", "user": "alice", "up": 1048576, "down": 52428800, "conns": 3, "ips": [{ "ip": "203.0.113.7", "conns": 3, "lastSeen": "2026-10-12T20:01:02Z" }], "lastActive": "2026-10-12T20:01:02Z", "rejected": 2, "rejectReasons": { "max-ips": 2 } }]Панель, которая забирает трафик раз в N секунд, вызывает reset=true и прибавляет полученное к своим итогам.
DELETE /connections?inbound=…&user=…
Заголовок раздела «DELETE /connections?inbound=…&user=…»Закрывает соединения пользователя (или всего входящего, если указан только inbound). Без параметров закрывает все соединения, как и раньше. Чтобы пользователь не подключился снова, его нужно убрать из конфига, удалить на лету или выставить ему expire-at в прошлом (см. лимиты пользователей).
Для встраивания ядра:
users := statistic.DefaultManager.Users()all := users.Snapshot() // накопительные счётчикиdelta := users.Drain() // байты с прошлого Drains, ok := users.Get(statistic.UserKey{Inbound: "vless-in", User: "alice"})Счётчик удаляется, когда у пользователя нет соединений, а его байты забраны через reset/Drain и:
- пользователь удалён на лету, или пользователь либо входящий убран из конфига при перезагрузке (для входящих, которые знают список пользователей: VLESS, Trojan, AnyTLS, TrustTunnel, TUIC, Shadowsocks, SOCKS/HTTP/mixed; встроенные
DEFAULT-*и прочие полагаются на простой), или - пользователь простаивает дольше 10 минут.
Если трафик не забирают, счётчик простаивающего пользователя удаляется через 20 минут. Очистка идёт раз в минуту.
