配置
流量统计
面板上有三个流量数字:
| 数字 | 从哪来 | 什么时候归零 |
|---|---|---|
| 总流量 | hub 侧累加 | 永不归零,也永不回退 |
| 本月流量 | 同上,另存一份 | 跨过这个节点的重置日 |
| 今日流量 | 同上 | 跨过 hub 本地时区的零点 |
三个数字约每分钟更新一次,实时网速不受影响。
为什么由 hub 累加
网卡流量来自内核计数器,它每次开机从零开始。直接显示的话,机器一重启,总流量就归零。
所以 agent 只上报内核计数器的当前读数和一个每次开机都会变的 boot_id,由 hub 累加,agent 保持无状态。
只计入 hub 看着增长的部分
读不出计数器 → 整行不动,不计流量也不改基线
boot_id 和上次一样 → delta = max(当前读数 - 上次读数, 0)
其余情况 → delta = 0,只重新对基线「其余情况」有三种:节点第一次上报、同一次开机内读数变小(某块网卡消失了)、boot_id 变了(重启了,或改了下文的统计网卡)。三种都只重新对基线,因为两种出错方式的代价差几个数量级:
- 按差值计入而判断错了:一次多出一整个 lifetime 计数器(几百 GB),总流量只增不减,只能手工改回
- 重新对基线:只丢掉开机到首次上报之间的量,通常几十秒、几百 KB
boot_id 变化时不计流量还有一个原因:同一条安装命令可能被装到了第二台机器上,两个 agent 用同一个 token
互相顶替,hub 每秒看到两个 boot_id 来回切换。按差值计入的话,实测每来回一次多出 180 GB。
agent 掉线期间的流量会补上
agent 停着的时候内核照样计数,重连后的第一次差值包含了这一段。流量确实跑了,商家也会算。
前提是机器没重启:掉线期间重启过,boot_id 变了,那一段没有基线可减。
哪些网卡计入
默认规则是同一份线路上的字节只数一次,大多数机器不用配置:
- lo、容器和虚拟机的网卡、隧道(WireGuard、Tailscale、tun、sit、gre、vxlan 等)不计
- 网桥、bond、VLAN、macvlan 这类叠在别的网卡上的设备不计,只计它们底下的那块
- 除了看名字,还按内核给出的链路信息判断,自己起名的网桥和隧道也认得出
- PPPoE 只认 OpenWrt 的
pppoe-wan。pppd 拨号的ppp0默认照计,因为 LTE 拨号时它是唯一的链路;用 pppd 拨 PPPoE 的机器会把拨号口和底下的网卡各算一遍,需要按下文指定
agent 启动时会打印一行,列出此刻计入的网卡:
# systemd
journalctl -u monitor-agent | grep "counting traffic"
# OpenRC
grep "counting traffic" /var/log/monitor-agent.logbash转发流量的机器要手动指定
软路由、桥接了软路由的宿主机上,一个包会先后经过 WAN 口和 LAN 口两块真网卡,按默认规则会算两遍。哪块面向运营商只有你知道,需要手动指定。
点节点的安装按钮打开弹窗,打开指定统计的网卡,在「只统计」或「不统计」里填网卡名,下面的安装命令随之带上 --iface。节点在线时,弹窗会显示并预填它当前的设置。
直接写命令也一样:
curl -fsSL https://hub.example.com/install.sh | sh -s -- \
--server https://hub.example.com --token <token> --iface eth1bash面向运营商的一般是默认路由所在的那块:
# dev 后面就是网卡名
ip route show defaultbash| 机器 | --iface |
|---|---|
| PPPoE 拨号 | 拨号口,OpenWrt 叫 pppoe-wan,pppd 叫 ppp0 |
| DHCP 或静态 IP 上网的软路由 | WAN 口,如 eth1 |
| PVE 宿主机上桥接了软路由 | 接运营商的那块物理口,如 enp1s0 |
| PVE 宿主机只算自己、不算 guest | vmbr0 |
写法:
| 弹窗 | 命令 | 含义 |
|---|---|---|
只统计 eth1, eth2 | --iface eth1,eth2 | 只统计列出的网卡,默认规则不再生效 |
不统计 eth0 | --iface -eth0 | 从本来会计入的网卡里去掉这一块,如软路由的 LAN 口;排除优先于列出 |
只认完整的网卡名,eth* 这类通配会被拒绝,以免什么都没匹配上却以为设好了。
批量添加的弹窗里也有这个选项。一批机器都有一块同名的内网网卡时(比如都叫 ens19),在「不统计」里填它,每台都只去掉那一块。
改设置
在安装弹窗里改好,复制命令到那台机器上重跑。开关关着时命令不带 --iface,重跑(包括升级)沿用机器上原来的设置;开关打开、两栏都留空,生成 --iface '',恢复默认规则。
也可以直接改配置文件:
# 改 MONITOR_IFACE= 这一行,没有就加一行
vi /opt/monitor/agent.env
# systemd
systemctl restart monitor-agent
# OpenRC
rc-service monitor-agent restartbash改了之后 hub 重新对基线:从这一刻起按新的网卡累加,已有的总流量不变,新旧两组网卡读数之差不会被当成流量。网卡增减、被重新归类时也一样。
月度周期按商家的重置日算
每个节点有自己的每月重置日(1–31),在编辑节点里设。
- 今天 ≥ 本月的重置日 → 周期从本月的重置日开始
- 否则 → 从上月的重置日开始
- 重置日超过当月天数就落到当月最后一天(设 31 号,2 月落到 28 或 29 号)
重置不靠定时任务,而是在节点下一次上报时触发,所以离线很久的节点重新上线时会从正确的周期开始。
读取时也会再判断一次周期:在周期边界之前掉线的节点,库里存的是上一周期的数字,读出来是 0,不会把上个月的用量当成这个月的。
每月额度
编辑节点里的每月额度(GB)留空或填 0 表示不限。计算方式决定拿哪个数去对额度,流量通知也按它算:
| 计算方式 | 拿去对额度的数 | 适用 |
|---|---|---|
| 上下行相加 | 上行 + 下行 | 大多数商家 |
| 取较大值 | 上行、下行中较大的一个 | 按较大方向计费 |
| 仅上行 | 上行 | 只限上行 |
| 仅下行 | 下行 | 只限下行 |
今日流量按本地时区
日边界和月边界都按 hub 所在机器的本地时区算,不按 UTC。Docker 部署要设 TZ,否则按 UTC 算,见
Docker 部署。
手工校正
在编辑节点里展开流量校正,按 GB 填入总流量或本月流量,用于换机器、迁移或修正一次误算。
只提交改过的项,没改的继续正常累计,不会把打开表单那一刻的数写回去。改本月的值时,hub 同时把周期记为当前周期,否则刚填的数会被当成上个周期的读成 0。
累计值不是从历史明细算出来的,调小保留天数不影响任何流量数字。