本文将教你如何用Grafana和Promethus搭配订制的node-exporter搭建一个用于统计V2ray和iptables端口转发流量的面板,最终效果如下:
修改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
里添加一个tag
为api
的dokodemo-door
,端口可以任意,记着后面要用routing
里把inputTag
为api
的流量设置outpuTag
policy
的levels
需要添加所有用户的level
(上述例子里只开启了level
为0
的流量统计功能)tag
,每个client
设置好email完成设置后可以通过
v2ctl api --server=127.0.0.1:10085 StatsService.QueryStats 'pattern: "" reset: false'
来验证流量统计是否开启
更多有关v2ray开启流量统计的设置可以参考V2ray 白话文指南
首先先确定你的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是否正确
这是最简单的部分,因为我已经写好了,直接根据自己的平台到这里下载对应的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>
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
这一步也比较简单,使用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 via grafana.com
里用ID:13674
,随便起个名字,点击Import
就可以了