Технически это и есть VPN, но из-за особенностей законодательства его всё чаще называют «ускорителем» или «стабильным каналом».
Мониторинг VLESS: как видеть нагрузку и аномалии
Когда я только поднял свой первый VLESS-сервер на VPS, я думал — поставил и забыл. Через месяц прилетел счёт за трафик на 3000 рублей, хотя сайтами я почти не пользовался. Оказалось, кто-то стучался в сервер, пакеты летели, а я ничего не видел. С тех пор мониторинг — первое, что я настраиваю после установки xray. Сегодня покажу, как поднять vnstat и Grafana для отслеживания трафика VLESS-сервера. Никакой магии, только консоль и прямые руки.
Что такое vnstat и почему он нужен для VLESS
vnstat — это консольная утилита, которая считает сетевой трафик на интерфейсах. Она не трогает содержимое пакетов, не лезет в DPI, просто смотрит на количество переданных байт. Для VLESS-сервера это база: вы видите, сколько трафика ушло на uplink и downlink за час, день, месяц.
Зачем это конкретно вам:
- Узнать, не жрёт ли кто-то ваш лимит на VPS (особенно если тариф с ограничением по трафику)
- Понять, какой из ваших клиентов (или протоколов — VLESS Reality vs WebSocket) создаёт нагрузку
- Заметить аномалии — например, в 3 часа ночи вдруг скачок до 500 Мбит/с, хотя вы спите
Я использую vnstat на сервере с Ubuntu 22.04. Ставится за 2 минуты, не требует перезагрузки xray или переписывания конфигов.
Как установить vnstat:
sudo apt update && sudo apt install vnstat -y
После установки демон запускается сам. Проверьте статус:
sudo systemctl status vnstat
Если видите active (running)» — всё ок. Если нет — sudo systemctl enable —now vnstat`.
Первые команды для новичка:
vnstat -i eth0— трафик за всё время на интерфейсе eth0 (у вас может быть ens3, enp1s0 — проверьте черезip a)vnstat -i eth0 -h— почасово за последние 24 часаvnstat -i eth0 -d— подневно
Я обычно смотрю vnstat -i eth0 -h —json и паршу в скрипты. Но для красоты нужна Grafana.
Настройка сбора метрик xray через API
vnstat покажет общий трафик на интерфейсе. Но чтобы разделить нагрузку по протоколам (VLESS Reality vs WebSocket) или по пользователям, нужно стучаться в API самого xray. У xray версии 1.8.0+ есть встроенный gRPC API для статистики.
Шаг 1 — включаем API в конфиге xray
Откройте /usr/local/etc/xray/config.json (или где у вас config). В секцию inbounds добавьте внутри каждого прокси:
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls"]
},
"streamSettings": {
"sockopt": {
"tcpFastOpen": true
}
}
И в корне конфига укажите API:
"api": {
"tag": "api",
"services": ["HandlerService", "LoggerService", "StatsService"]
},
"stats": {},
"policy": {
"levels": {
"0": {
"statsUserUplink": true,
"statsUserDownlink": true
}
},
"system": {
"statsInboundUplink": true,
"statsInboundDownlink": true,
"statsOutboundUplink": true,
"statsDownlink": true
}
}
После этого перезапустите xray:
sudo systemctl restart xray
Проверьте, что API доступен:
curl -X POST http://localhost:8080/api/stats/query -d "{}"
Если ответ не пустой — метрики собираются.
Шаг 2 — установка Prometheus и Node Exporter (опционально)
xray не отдаёт метрики напрямую в Prometheus формате проще запрашивать через gRPC-прокси. Но если хотите классику — поставьте prometheus и node_exporter:
sudo apt install prometheus prometheus-node-exporter -y
Затем настройте prometheus.yml:
scrape_configs:
- job_name: 'xray_stats'
static_configs:
- targets: ['localhost:9090']
Но лично я предпочитаю более лёгкую связку: vnstat + custom exporter.
Шаг 3 — сборщик метрик для Grafana
Самый простой способ для новичка — установить telegraf и пушить данные в InfluxDB. Но я пользуюсь самописным скриптом на Python с библиотекой requests и influxdb-client. Публикую базовый вариант:
import subprocess, json, time
from influxdb_client import InfluxDBClient, Point
from influxdb_client.client.write_api import SYNCHRONOUS
# Получаем трафик из vnstat
result = subprocess.run(['vnstat', '-i', 'eth0', '--json'], capture_output=True, text=True)
data = json.loads(result.stdout)
rx_bytes = data['interfaces'][0]['traffic']['total']['rx']
tx_bytes = data['interfaces'][0]['traffic']['total']['tx']
# Отправляем в InfluxDB
client = InfluxDBClient(url="http://localhost:8086", token="my-token", org="my-org")
write_api = client.write_api(write_options=SYNCHRONOUS)
point = Point("vless_traffic").field("rx", rx_bytes).field("tx", tx_bytes)
write_api.write(bucket="vpn_metrics", record=point)
Запускайте этот скрипт по cron каждую минуту. Но если вы не хотите возиться с кодом — используйте vnstat + Grafana через плагин.
Как собрать дашборд в Grafana из vnstat данных
Grafana — это визуализация. В неё можно скормить данные напрямую из vnstat, если у вас БД (InfluxDB, Prometheus) или через SQLite-файл vnstat.
Способ для ленивых — CSV-экспорт
vnstat умеет экспортировать в CSV:
vnstat -i eth0 -d --csv > /tmp/vnstat_daily.csv
Затем в Grafana добавьте источник данных «CSV» и загружайте файл. Но это не real-time.
Способ правильный — через InfluxDB + vnstat
Установите InfluxDB 2.x:
wget https://dl.influxdata.com/influxdb/releases/influxdb2-2.7.4-linux-amd64.tar.gz
tar xzf influxdb2-2.7.4-linux-amd64.tar.gz
cd influxdb2-2.7.4-linux-amd64 && ./influxd
Скрипт из предыдущего раздела будет отправлять метрики каждую минуту. В Grafana настройте источник InfluxDB с бакетом vpn_metrics.
Создание дашборда в Grafana:
- Добавьте панель типа «Graph / Time series»
- Query:
from(bucket: "vpn_metrics") |> range(start: -24h) |> filter(fn: (r) => r._measurement == "vless_traffic") - Выберите поле
_valueи агрегациюmean - По оси Y — bytes, по оси X — время
Я вывожу три метрики: rx, tx, сумма. Для суммы добавляю трансформацию «Add field from calculation» → rx + tx.
Типичные метрики на дашборде:
- Трафик за последний час (Мбайт/мин)
- Трафик за сутки (Гбайт)
- Пиковая скорость (Мбит/с)
- Аномалии — сравнение с предыдущей неделей
Результат: вижу, когда мой VLESS Reality сервер нагружается больше всего. Обычно это вечер пятницы — 20:00–23:00, пик до 80 Мбит/с.
Подводные камни с мониторингом трафика VLESS
Через месяц использования я наткнулся на несколько граблей:
1. vnstat считает весь трафик на интерфейсе, не только VLESS
Если на VPS крутится ещё nginx или postfix — vnstat покажет суммарные цифры. Решение — запускайте xray на отдельном интерфейсе (через Docker) или используйте cgroup для изоляции. Я сделал проще: поднял xray на порту 443, nginx на 80, и в vnstat смотрю только трафик на порт 443 через iptables:
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
Но это необязательно, если VPS только для VLESS.
2. gRPC API xray не отдаёт трафик по пользователям без доп настроек
Если вы используете VLESS с разными клиентами и хотите видеть, кто сколько съел — в конфиге xray нужно добавить "users" с уникальными email тегами. И затем в API запрашивать stats.user.downlink для каждого email. Я забил на это на старте, так как клиентов мало.
3. Режим энергосбережения на VPS может сбросить счётчики vnstat
На дешёвых VPS (1 vCPU, 512 MB RAM) при перезагрузке сбрасывается БД vnstat. Лечится настройкой автобэкапа:
sudo vnstat -u
Или переносом БД в /var/lib/vnstat/ на постоянный диск.
4. Если используете VLESS WebSocket — трафик проходит через дополнительный прокси (nginx)
В конфигурации с WebSocket часто ставят nginx как реверс-прокси. Тогда vnstat на VPS покажет трафик nginx, а не напрямую xray. Чтобы увидеть реальный трафик xray — смотрите метрики на порту, где висит сам xray (обычно 54443), а не на 443.
Проверка и метрики — что вы получите в итоге
Спустя неделю работы дашборда у меня такие цифры:
- Средний входящий трафик за день: 1.2 Гбайт (RX)
- Средний исходящий трафик за день: 3.8 Гбайт (TX)
- Пиковая скорость: 120 Мбит/с в 21:30
- Количество аномалий: 2 (одна — ночной скрипт бэкапа на 5 Гбайт)
Сам дашборд в Grafana выглядит как три графика: «RX vs TX за 24 часа», «Общий трафик за месяц», «Скорость». Всё обновляется раз в минуту.
Проверка работоспособности:
vnstat -i eth0 -h
Если видите активность за последние часы — мониторинг работает.
Альтернативы vnstat и Grafana
nload — проще для скорости
Консольная утилита, показывает текущую скорость входа/выхода в реальном времени. Ставится sudo apt install nload. Я запускаю nload eth0 -u M и вижу скорость в мегабайтах. Минус — не сохраняет историю, нет дашборда.
iftop — для трафика по соединениям
Показывает, какие IP-адреса сейчас жрут трафик. sudo iftop -i eth0. Помогает найти спамеров, которые долбятся в сервер. В моём случае я увидел, что один клиент качает торренты через VLESS — пришлось ограничить скорость.
Netdata — готовый дашборд за 5 минут
Ставится одной командой:
bash <(curl -Ss https://my-netdata.io/kickstart.sh)
Даёт мониторинг CPU, RAM, диска и сетевого трафика в браузере. Мне не хватило гибкости — слишком много лишней информации, сложно выделить только VLESS.
Zabbix — enterprise-уровень
Если у вас кластер из 10+ серверов — ставьте Zabbix. Для одного VPS с VLESS это оверинжиниринг.
Частые вопросы
Почему vnstat показывает 0 трафика, хотя я пользуюсь сервером?
Проверьте имя интерфейса: vnstat по умолчанию смотрит на eth0, а у вас может быть ens3 или enp1s0. Введите ip a — увидите активный интерфейс. Затем sudo vnstat -u -i ens3 и указывайте его в командах.
Можно ли настроить оповещения о превышении трафика в Grafana?
Да. В Grafana есть функция «Alerting». Настраиваете триггер: если трафик за час превышает 10 Гбайт — шлёте уведомление в Telegram через webhook. Я настроил так: при превышении 5 Гбайт/день приходит сообщение в бот. Подробно про настройку — в документации Grafana Alerting.
Как посмотреть трафик отдельно по протоколам VLESS Reality и VLESS WebSocket?
Через API xray, как я описал выше. Другой способ — разделить порты: Reality висит на 443, WebSocket на 8443. Тогда vnstat может считать трафик на разных портах через iptables или nftables.
Сколько ресурсов съедает такой мониторинг на VPS?
У меня на 1 vCPU и 1 GB RAM сам мониторинг (vnstat + InfluxDB + Grafana) ест около 120 MB RAM и 2-3% CPU. Если VPS совсем слабый — используйте только vnstat без Grafana, данных хватит для анализа.
Почему не вижу метрики в Grafana после настройки InfluxDB?
Проверьте токен и имя бакета. Частая ошибка — несовпадение org и bucket. Я делал так: в InfluxDB создал bucket с именем vpn_metrics и org my-org. В скрипте и в настройках Grafana должно быть то же самое. Если ничего не помогает — добавьте в скрипт print(«sent»), чтобы убедиться, что данные доходят.
Мониторинг — не роскошь, а необходимость для любого, кто держит свой VLESS-сервер. Без него вы рискуете нарваться на перерасход трафика или пропустить атаку. vnstat + Grafana решают задачу за 30 минут и не требуют мощного железа.
Если возиться с сервером не хочется — используйте готовый сервис. 🎁 3 дня бесплатно — для тебя