Введение

У меня как и многих айтишников был свой 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, по которому и производится их отбор.

Процесс будет состоять из нескольких этапов

  1. Конфигурирование XRay на выдачу метрик и статистики

  2. Конфигурирование экспортера и агента для отправки информации в Grafana Cloud

  3. Добавление дашбоарда в Grafana Cloud для отображения статистики

Конфигурирование XRay

Всё необходимое хорошо описано в родной документации тут. Поэтому далее только краткие выжимки.

Предполагается что конфиг разбит на отдельные файлы, но если он настроен "всё в одном", то просто находите соответствующее место в нём и добавляете / правите информацию там.

По умолчанию конфиг может располагаться либо в папке с XRay, либо в /etc/xray/confs/. Я предпочитаю второй вариант, так как не надо копировать конфиг при каждом обновлении.

Цифры в названии файлов означают порядок в котором они будут считываться в процессе запуска. Я ориентировался на порядок элементов в основном конфиге.

В конфиге предполагается, что статистика выдаётся на порт API 8080, а метрики на порт 11111 (поменять можно в разделе Inbounds).

  1. Добавляете файл 02_api.json со следующим содержанием

{
  "api": {
    "tag": "api",
    "services": [
        "StatsService"
    ]
  }
}
  1. Добавляете файл 04_routing.json со следующим содержанием (у меня он был пустым, если у вас не так, то просто добавьте необходимые правила)

  "routing": {
    "rules": [
      {
        "type": "field",
        "inboundTag": [
          "metrics_in"
        ],
        "outboundTag": "metrics_out"
      },
      {
        "type": "field",
        "inboundTag": [
          "api"
        ],
        "outboundTag": "api"
      }
	],
    "domainStrategy": "AsIs"
  }
  1. Добавляете файл 05_policy.json со следующим содержанием. У меня он был пустым, если у вас не так, то просто добавьте необходимые правила. Политики определяют сбор статистики как в общем, так и по уровням пользователей.

{
  "policy": {
    "levels": {
      "0": {
        "statsUserUplink": true,
        "statsUserDownlink": true
      }
    },
    "system": {
      "statsInboundUplink": true,
      "statsInboundDownlink": true,
      "statsOutboundUplink": true,
      "statsOutboundDownlink": true
    }
  }
}
  1. Добавляете файл 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"
    }
  1. Добавляете файл 09_stats.json со следующим содержанием

{
  "stats": {}
}
  1. Добавляете файл 13_metrics.json со следующим содержанием

{
  "metrics": {
    "tag": "metrics_out"
  }
}
  1. В принципе на этом этапе конфигурирование завершено, и после перезапуска VPN, он должен начать выдавать статистику и метрики. Так что перезапускаем и смотрим, что всё запустилось нормально.

systemctl restart xray
journalctl --pager-end --unit xray

где сервис запускается командой

/opt/xray/xray run -confdir /etc/xray/confs

у меня используется параметр confdir - так как используются множественные конфиги.

  1. Тестируем, что выдаётся статистика через 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

  1. Скачиваем вариант дашбоарда для Grafana (он не идеален, но при желании можно его доработать)

  2. В Grafana выбираем Home -> Dashboards -> New -> Import и указываем путь к скачанному JSON файлу. Нажимаем Load и Voila! у вас есть дашбоард для Xray.

Послесловие

К сожалению проект с экспортером практически заброшен давно не обновлялся, так что в данный момент он показывает "V2Ray" статистику вместо "XRay". Это не аккуратненько, но если нам ехать, то сойдёт. ?

Как следует из гуглоперевода этого бага, при желании можно перекомпилировать exporter.go заменив в нём на xray.

Меня это не настолько напрягает, так что я этого делать не стал.

Комментарии (4)


  1. Spyman
    19.08.2024 19:45

    Не совсем по теме, но может тут кто подскажет - есть какой простой способ сделать 1 порт по http доступным в обход впн (чтобы на 3000 порту например висел сервер и слушал). А то разворачивал xray +xtls из контейнера в докере, весьма слабо понимаю что там происходит, но после http сервер на той же машине стал недоступен(


  1. losander
    19.08.2024 19:45

    А как быть после перезагрузки xray? Там же стата в 0 сбрасывается. Или экспортер это умно обработает?


    1. 0mogol0 Автор
      19.08.2024 19:45

      Честно говоря не знаю, но сомневаюсь, что он как-то по умному обрабатывает.

      Для меня это не слишком актуально, так как главное, видеть, что есть трафик, т.е. сервер работает. Ну и примерно кто и сколько качает. А рестартую я его обычно раз в месяц при плановом обновлении.

      Пока заметил другую проблему, почему-то дашбоард отказывается обновляться в автоматическом режиме, только по F5.


      1. losander
        19.08.2024 19:45

        А как же рестарт после удаления/добавления клиентов?