Перейти к содержимому
НовостиGitHubСкачать

Трафик пользователей

Ядро считает трафик каждого пользователя входящего — пары «имя входящего» + «пользователь», как их видят правила 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.

Параметры (все необязательные):

Параметр Значение
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 и прибавляет полученное к своим итогам.

Закрывает соединения пользователя (или всего входящего, если указан только inbound). Без параметров закрывает все соединения, как и раньше. Чтобы пользователь не подключился снова, его нужно убрать из конфига, удалить на лету или выставить ему expire-at в прошлом (см. лимиты пользователей).

Для встраивания ядра:

users := statistic.DefaultManager.Users()
all := users.Snapshot() // накопительные счётчики
delta := users.Drain() // байты с прошлого Drain
s, ok := users.Get(statistic.UserKey{Inbound: "vless-in", User: "alice"})

Счётчик удаляется, когда у пользователя нет соединений, а его байты забраны через reset/Drain и:

  • пользователь удалён на лету, или пользователь либо входящий убран из конфига при перезагрузке (для входящих, которые знают список пользователей: VLESS, Trojan, AnyTLS, TrustTunnel, TUIC, Shadowsocks, SOCKS/HTTP/mixed; встроенные DEFAULT-* и прочие полагаются на простой), или
  • пользователь простаивает дольше 10 минут.

Если трафик не забирают, счётчик простаивающего пользователя удаляется через 20 минут. Очистка идёт раз в минуту.