Введение
У меня как и многих айтишников был свой VPS сервер с настроенным OpenVPN, работоспособность которого я мониторил на бесплатном инстансе Grafana Cloud. В начале года "по неизвестным причинам" (tm) OpenVPN стал работать нестабильно. Было принято решение поднять и настроить XRay, который с тех пор работал без проблем.
Но был у него недостаток. К нему не было нормального и простого мануала по настройке мониторинга, в итоге контролировать его работу я мог только косвенно, по изменению общего сетевого трафика всего сервера.
Спасибо @vsviridov, который подсказал подходящий экспортер.
Но так как на данный момент информация по настройке мониторинга разбросана по нескольким документам, то решил кратко свести всё в один документ. В первую очередь для себя, но может пригодится кому-то ещё.
Подготовка
Предполагается что есть настроенный инстанс XRay в Ubuntu, а так же есть настроенный инстанс Grafana Cloud, в который, с помощью уже сконфигурированного Grafana Agent, доставляются логи прочие метрики.
Задача добавить доставку метрик и отображение информации в Grafana для XRay.
К сожалению в родной документации интеграция с Prometheus убрана.
NB! Разбирается базовое конфигурирование. Предполагается, что читатель знаком с JSON и YAML синтаксисом и ему не требуется объяснять, что и куда копировать.
Большая часть команд требует прав суперпользователя.
Нам потребуется V2Ray-Exporter пакет для экспорта метрик для предшественника XRay, но отлично работающий и с новой версией. Так же он включает в себя пример dashboard для Grafana.
Для получения статистики по пользователям, у каждого пользователя должен быть указан email, по которому и производится их отбор.
Процесс будет состоять из нескольких этапов
Конфигурирование XRay на выдачу метрик и статистики
Конфигурирование экспортера и агента для отправки информации в Grafana Cloud
Добавление дашбоарда в Grafana Cloud для отображения статистики
Конфигурирование XRay
Всё необходимое хорошо описано в родной документации тут. Поэтому далее только краткие выжимки.
Предполагается что конфиг разбит на отдельные файлы, но если он настроен "всё в одном", то просто находите соответствующее место в нём и добавляете / правите информацию там.
По умолчанию конфиг может располагаться либо в папке с XRay, либо в /etc/xray/confs/. Я предпочитаю второй вариант, так как не надо копировать конфиг при каждом обновлении.
Цифры в названии файлов означают порядок в котором они будут считываться в процессе запуска. Я ориентировался на порядок элементов в основном конфиге.
В конфиге предполагается, что статистика выдаётся на порт API 8080, а метрики на порт 11111 (поменять можно в разделе Inbounds).
Добавляете файл 02_api.json со следующим содержанием
{
"api": {
"tag": "api",
"services": [
"StatsService"
]
}
}
Добавляете файл 04_routing.json со следующим содержанием (у меня он был пустым, если у вас не так, то просто добавьте необходимые правила)
"routing": {
"rules": [
{
"type": "field",
"inboundTag": [
"metrics_in"
],
"outboundTag": "metrics_out"
},
{
"type": "field",
"inboundTag": [
"api"
],
"outboundTag": "api"
}
],
"domainStrategy": "AsIs"
}
Добавляете файл 05_policy.json со следующим содержанием. У меня он был пустым, если у вас не так, то просто добавьте необходимые правила. Политики определяют сбор статистики как в общем, так и по уровням пользователей.
{
"policy": {
"levels": {
"0": {
"statsUserUplink": true,
"statsUserDownlink": true
}
},
"system": {
"statsInboundUplink": true,
"statsInboundDownlink": true,
"statsOutboundUplink": true,
"statsOutboundDownlink": true
}
}
}
Добавляете файл 06_inbounds.json фрагмент со следующим содержанием в самый конец после существующих правил для пользователей. Он определяет правила для метрик и API.
{
"port": 11111,
"protocol": "dokodemo-door",
"tag": "metrics_in",
"listen": "127.0.0.1",
"settings": {
"address": "127.0.0.1"
}
},
{
"listen": "127.0.0.1",
"port": 8080,
"protocol": "dokodemo-door",
"settings": {
"address": "127.0.0.1"
},
"tag": "api"
}
Добавляете файл 09_stats.json со следующим содержанием
{
"stats": {}
}
Добавляете файл 13_metrics.json со следующим содержанием
{
"metrics": {
"tag": "metrics_out"
}
}
В принципе на этом этапе конфигурирование завершено, и после перезапуска VPN, он должен начать выдавать статистику и метрики. Так что перезапускаем и смотрим, что всё запустилось нормально.
systemctl restart xray
journalctl --pager-end --unit xray
где сервис запускается командой
/opt/xray/xray run -confdir /etc/xray/confs
у меня используется параметр confdir - так как используются множественные конфиги.
Тестируем, что выдаётся статистика через API
/opt/xray/xray api stats --server=127.0.0.1:8080 -name "user>>>"user_email">>>traffic>>>uplink"
здесь команда выдаёт исходящий траффик от пользователя с "user_email" (email пользователя указанный в конфиге, вводится без кавычек).
и что выдаются метрики
curl http://127.0.0.1:11111/debug/vars
Конфигурирование экспортера и агента
Сначала скачайте по ссылке выше экспортер на ваш сервер, я предлагаю в папку /opt/v2ray-exporter и сделайте его исполняемым.
Для конфигурирования экспортера вам потребуется указать порт API XRay сервера (8080) и порт для Grafana Agent (8081)
./v2ray-exporter --v2ray-endpoint "127.0.0.1:8080" --listen localhost:8081 &
Для конфигурирования Grafana Agent, который по умолчанию называется /etc/grafana-agent.yaml, добавьте в конец секции metrics: -> configs: (в примере предполагается, что других элементов нет, если они есть, то добавляйте всё что после configs:)
Замените GRAFANA_URL, USER, PASSWORD на значение вашего инстанса!
metrics:
configs:
- name: xtls
scrape_configs:
- job_name: xtls
static_configs:
- targets: ['localhost:8081']
remote_write:
- url: <GRAFANA_URL>
basic_auth:
username: <USER>
password: <PASSWORD>
Перезапустите агент
systemctl restart grafana-agent
journalctl --pager-end --unit grafana-agent
Если ошибок нет, то ваш агент должен начать отправлять метрики в Grafana.
Добавление дашбоарда в Grafana Cloud
Скачиваем вариант дашбоарда для Grafana (он не идеален, но при желании можно его доработать)
В Grafana выбираем Home -> Dashboards -> New -> Import и указываем путь к скачанному JSON файлу. Нажимаем Load и Voila! у вас есть дашбоард для Xray.
Послесловие
К сожалению проект с экспортером практически заброшен давно не обновлялся, так что в данный момент он показывает "V2Ray" статистику вместо "XRay". Это не аккуратненько, но если нам ехать, то сойдёт. ?
Как следует из гуглоперевода этого бага, при желании можно перекомпилировать exporter.go заменив в нём на xray.
Меня это не настолько напрягает, так что я этого делать не стал.
Комментарии (4)
losander
19.08.2024 19:45А как быть после перезагрузки xray? Там же стата в 0 сбрасывается. Или экспортер это умно обработает?
0mogol0 Автор
19.08.2024 19:45Честно говоря не знаю, но сомневаюсь, что он как-то по умному обрабатывает.
Для меня это не слишком актуально, так как главное, видеть, что есть трафик, т.е. сервер работает. Ну и примерно кто и сколько качает. А рестартую я его обычно раз в месяц при плановом обновлении.
Пока заметил другую проблему, почему-то дашбоард отказывается обновляться в автоматическом режиме, только по F5.
Spyman
Не совсем по теме, но может тут кто подскажет - есть какой простой способ сделать 1 порт по http доступным в обход впн (чтобы на 3000 порту например висел сервер и слушал). А то разворачивал xray +xtls из контейнера в докере, весьма слабо понимаю что там происходит, но после http сервер на той же машине стал недоступен(