利用Grafana和Promethus搭建流量统计面板

08 August, 2020

本文将教你如何用Grafana和Promethus搭配订制的node-exporter搭建一个用于统计V2ray和iptables端口转发流量的面板,最终效果如下:

v2ray dashboard2

准备工作

开启V2ray统计功能

修改V2ray的配置文件,一般位于/etc/v2ray/config.json/usr/local/etc/v2ray/config.json,添加如下几行配置:

{
  ...
  "stats": {},
  "api": {
    "tag": "api",
    "services": ["StatsService"]
  },
  "policy": {
    "levels": {
      "0": {
        "statsUserUplink": true,
        "statsUserDownlink": true
      }
    },
    "system": {
      "statsInboundUplink": true,
      "statsInboundDownlink": true
    }
  },
  "inbounds": [
    ...
    {
      "listen": "127.0.0.1",
      "port": 10085,
      "protocol": "dokodemo-door",
      "settings": {
        "address": "127.0.0.1"
      },
      "tag": "api"
    }
    ...
  ],
  "routing": {
    "settings":{
      "rules": [
        ...
        {
          "inboundTag":[
            "api"
          ],
          "outboundTag":"api",
          "type":"field"
        }
        ...
      ],
      ...
    },
    ...
  }
}

最重要的几个变化是:

  • 添加"stats: {}""api": {"tag": "api", "services": ["StatsService"]},
  • inbounds里添加一个tagapidokodemo-door,端口可以任意,记着后面要用
  • routing里把inputTagapi的流量设置outpuTag
  • policylevels需要添加所有用户的level(上述例子里只开启了level0的流量统计功能)
  • 非常重要:每个inbound设置一个tag,每个client设置好email

完成设置后可以通过v2ctl api --server=127.0.0.1:10085 StatsService.QueryStats 'pattern: "" reset: false'来验证流量统计是否开启

更多有关v2ray开启流量统计的设置可以参考V2ray 白话文指南

开启iptables转发端口的流量统计

首先先确定你的iptables端口转发是通过SNAT/DNAT来实现,如果没有的话,可以参考监控gost/socat/brook中转的流量自己添加统计功能。查看iptables的配置确认一下大概会看起来像这样:

iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       tcp  --  anywhere             anywhere             tcp dpt:11111 to:8.8.8.8:10000

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
SNAT       tcp  --  anywhere             8.8.8.8      tcp dpt:10000 to:192.168.1.1

定义本地端口为PORT,远端IP为REMOTE_IP,远端端口为REMOTE_PORT,再添加如下两条iptables规则:

iptables -A FORWARD -p tcp -d REMOTE_IP --dport REMOTE_PORT -j ACCEPT -m comment --comment "UPLOAD PORT->REMOTE_IP:REMOTE_PORT"
iptables -A FORWARD -p tcp -s REMOTE_IP -j ACCEPT -m comment --comment "DOWNLOAD PORT->REMOTE_IP:REMOTE_PORT"

--comment里的内容特别重要,是用来区分流量的唯一依据,你也可以使用这个脚本来添加端口转发,这个脚本会自动添加上述两条规则,用法:

bash iptables.sh forward PORT REMOTE_IP REMOTE_PORT

检查一下统计功能:

iptables -nxvL

Chain INPUT (policy ACCEPT 19366 packets, 15977101 bytes)
    pkts      bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
    pkts      bytes target     prot opt in     out     source               destination
     223    11604 ACCEPT     tcp  --  *      *       0.0.0.0/0            8.8.8.8      tcp dpt:10000 /* UPLOAD 11111->8.8.8.8:10000 */
     146     7600 ACCEPT     tcp  --  *      *       8.8.8.8      0.0.0.0/0            /* DOWNLOAD 11111->8.8.8.8:10000 */

Chain OUTPUT (policy ACCEPT 15543 packets, 9129206 bytes)
    pkts      bytes target     prot opt in     out     source               destination

注意bytes这一栏是不是大于零(如果本来就没有流量的话,可以telent一下这个端口),和注释里的端口/IP是否正确

安装Promethus node exporter

这是最简单的部分,因为我已经写好了,直接根据自己的平台到这里下载对应的binary,运行就可以了:

注意这些操作都需要在root下运行

wget -O /tmp/node-exporter https://github.com/LeiShi1313/node_exporter/releases/download/v1.1.1/node_exporter_linux-amd64
mv /tmp/node-exporter /usr/local/bin
chmod +x /usr/local/bin/node-exporter
nohup node-exporter --collector.iptables --collector.v2ray --collector.v2ray.endpoint="127.0.0.1:10085" > /dev/null 2>&1 &

测试一下node exporter是否正常运行:

curl localhost:9100
<html>
<head><title>Node Exporter</title></head>
<body>
<h1>Node Exporter</h1>
<p><a href='/metrics'>Metrics</a></p>
</body>
</html>

利用systemd更科学地管理node exporter

cat > /etc/systemd/system/node-exporter.service <<EOF
[Unit]
Description=Node Exporter with V2ray and Iptables collector
After=network-online.target
Wants=network-online.target

[Service]
User=root
ExecStart=/usr/local/bin/node-exporter --collector.iptables --collector.v2ray --collector.v2ray.endpoint="127.0.0.1:10085"

[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable node-exporter
systemctl start node-exporter

Grafana & Promethus

启动服务

这一步也比较简单,使用docker-compose up -d就可以了,docker-compose.yml我也写好了

git clone https://github.com/LeiShi1313/docker-composes.git
cd docker-composes/grafana_promethus

首先编辑下promethus.yml:

global:
  scrape_interval: 10s

- job_name: v2ray
  metrics_path: /metrics
  static_configs:
  - targets: ['**被监控的服务器IP地址**:9100']
  - targets: ['**被监控的另一台服务器IP地址**:9100']

然后docker-compose up -d就可以了,打开浏览器看看Grafana服务器IP:3000有没有起来,然后用admin/admin登录就可以了。

添加流量统计面板

首先添加一个面板,+->Import grafana import

然后在Import via grafana.com里用ID:13674,随便起个名字,点击Import就可以了

进阶玩法

监控gost/socat/brook中转的流量

请移步

添加离线报警,超速警告

TODO

修改exporter,监控其他metrics

TODO

© 2022 Lei Shi. All rights reserved.