|
本帖最后由 wulishui 于 2024-1-9 22:34 编辑
并非是我的路由器不稳定,而是我非常折腾,三头两日就刷、重启,这是在家以来第一次最长时间不重启路由器,但其实一样天天折腾,只是不重启而已。
之所以不重启这个,是因为折腾x86去了,经历了近一年,x86主板终于被我修好,60天不重启将成为过去,即将撤下它换x86。
下面入正题。
历年以来OP上曾经出现过的流量统计插件有:
最老牌的:luci-app-wrtbwmon (https://github.com/brvphoenix/luci-app-wrtbwmon)
linkease搞的:luci-app-rtbwmon (https://github.com/linkease/openwrt-app-actions)
原作者未明:wtBRMon (https://www.right.com.cn/forum/forum.php?mod=viewthread&tid=362533)
luci-app-wrtbwmon的作者是花了非常多的心血在这上面的,缝缝补补折腾了很多年,搞得太复杂了,甚至有时候出现很要命的问题:产生无限多子进程,直至CPU耗尽(甚至根本不明白他的思路,为什么要这样搞)。
linkease的大佬可能也觉得wrtbwmon不太爽,自起炉灶,搞了个luci-app-rtbwmon,从代码上很容易发现是参考了luci-app-wrtbwmon,只是它又过于简陋。
上面两位大佬的都有各自的优点,也有各自的不优点。
luci-app-wrtbwmon 基于iptables统计,一般还好,除了上面CPU耗尽大问题外,它统计不准:比如老王上午上了会网,出去了,下午回来,上午的流量居然没和上午的统计在一起(IP变动了)。
luci-app-rtbwmon一样基于iptables统计,只是个毛坯房,能用,无累积统计,只能计算流速(而且也很不准),还无ipv6。但就是因为功能单一,拿来做实验是最好不过。
wtBRMon可以看出作者也花了很多心血,因为这套webui组件太复杂,不投入心血研究根本无法完成。可是对比发现,这套webui是最优秀的。
用过luci-app-nlbwmon的道友会发现,利用连接统计的流量可以统计到路由器自身产生的流量(路由器作为上级的客户端,流量不经过iptables表),于是着手研究使用nlbwmon来统计流量。
nlbwmon的优点是使用MAC统计,不会出现老王上午蹲过,下午他的流量算在老李头上的事情。
下面这是使用luci-app-rtbwmon来修改,通过nlbwmon统计的(注意,只是研究品,不要妄想真正实用):
界面大致如下:
首先安装luci-app-nlbwmon,在配置里面把刷新率改为1s,监听网卡改为lan、wan,应用。上面的插件不需要安装,只需要按路径copy进去,/usr/libexec/rtbwmon改0755权限就行了。
可以直接支持luci-app-wrtbwmon的用户别名,并且不用分大小写和 : 与 - 分隔。
下面是脚本代码:
- #!/bin/sh
- tmpfile=/tmp/tmp/$(date +%s%N |tail -c 5).tmp
- while read LeaseTime mac ip name unknow
- do
- eval "name_${mac//:/_}="$name""
- done < /tmp/dhcp.leases
- cat /etc/wrtbwmon.user 2>/dev/null |awk -F ',' '{print tolower($1)","$2}' > $tmpfile
- while IFS="," read mac name
- do
- eval "name_${mac//[:-]/_}="$name""
- done < $tmpfile
- ip -4 route |grep '^default' |awk '{print $3}' > $tmpfile
- while read ip
- do
- eval "mac=\$mac_${ip//[.:]/_}"
- [ -n "$mac" ] && eval "black_${mac//:/_}=1"
- done < $tmpfile
- nlbw -c csv -g mac -q > $tmpfile
- while read mac conns rx_bytes rx_pkts tx_bytes tx_pkts
- do
- eval "tx_${mac//:/_}="$tx_bytes""
- eval "rx_${mac//:/_}="$rx_bytes""
- done < $tmpfile
- cat /proc/net/arp |grep '^[0-9]*\.' |grep '0x2' |tr -s ' ' |sort -k4,4 -u > $tmpfile
- while read ip HWType Flags mac Mask iface
- do
- eval "black=\$black_${mac//:/_}"
- if [ "$black" != 1 ]; then
- eval "up=\$tx_${mac//:/_}"
- eval "down=\$rx_${mac//:/_}"
- eval "name=\$name_${mac//:/_}"
- [ -n "$down" ] && echo "$ip,$mac,$iface,0,${up:-0},0,${down:-0},${name:-?}"
- fi
- done < $tmpfile
- rm -f $tmpfile
- exit 0
复制代码
主要问题:
nlbwmon它有个尿性:它写死了更新时间,它只按设定的时间更新,无论你什么时候查询,它都是把内存中的数据抄给你,而不是实时更新给你。它默认是5分钟更新一次,所以你查询到的结果是上个纪元的。因此,我们需要把更新时间设为1秒,接近于实时更新。
这带来个大问题:统计连接数极其耗费CPU资源,大约1000条连接数能耗费10%左右CPU单核心资源,即使你不查询的时候它也非常耗费资源。但是好在它耗尽CPU资源时崩溃的是它自己,系统不会出问题,可以放心折腾。
所以这是它最不实用的地方,除非你能解决。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|