OpenWrt 頻寬管理 (依照使用者)
文章目錄
需求
找一個 OpenWrt 上的頻寬管理工具, 看誰用了多少頻寬. 以 Asuswrt-Merlin 來說, 目前提供的報表如下, 他可以依照使用者或時段來看流量. 甚至都幫你挑出他在做甚麼了, 譬如下圖中的 Facebook, LINE 等等, 很方便.
其他 Asuswrt-Merlin 提供的報表可參考這裡: https://www.asuswrt-merlin.net/screenshots
OpenWrt 的方案
有一堆... 多到眼花撩亂 https://openwrt.org/docs/guide-user/services/network_monitoring/bwmon#available_tools
這裡假設你已經有現成的 Grafana 和 Prometheus
Grafana 的部分如果沒有, 可使用 Grafana Cloud
Prometheus 似乎沒有免費的可用, 得自己找機器裝一個.!!! (Raspberry Pi 就夠了)
1. nlbwmon (Netlink based traffic accounting)
-
網站
-
安裝指令
1opkg install nlbwmon 2opkg install luci-app-nlbwmon
-
使用
-
連線到選單上的 Service -> Bandwidth Monitor (http://192.168.1.1/cgi-bin/luci/admin/services/nlbw)
-
基本報表如下
-
依照 Protocol 分類的報表
-
2. wrtbwmon
-
網站
- 官方網站(GUI): https://github.com/brvphoenix/wrtbwmon/
- 官方網站(Daemon): https://github.com/brvphoenix/luci-app-wrtbwmon/
-
安裝
這個 package 沒有放上 opkg repository, 得手動安裝, 有人問原因, 但作者沒回. 所以只能手動安裝, 先到下面兩個地方下載最新版的程式.
- https://github.com/brvphoenix/wrtbwmon/releases
- https://github.com/brvphoenix/luci-app-wrtbwmon/releases
執行以下指令
1opkg install wrtbwmon_1.2.1-3_all.ipk 2opkg install luci-app-wrtbwmon_2.0.10_all.ipk
-
使用
- 連線到選單上的 Network -> Traffic Status (http://192.168.1.1/cgi-bin/luci/admin/network/usage/details), 報表如下
- 他上面的綠色 bar 是即時更新的
- 你可以依照 MAC 修改 client 的名字
3. iptmon (Simple iptables bandwidth monitor)
-
網站
- 官方 GitHub (最後一次更新是 2021/3/1): https://github.com/oofnikj/iptmon
-
安裝
-
執行以下指令安裝
1opkg install collectd-mod-iptables 2opkg install iptmon_0.1.6-1_all.ipk # 請換成你使用的版本
-
設定 Firewall Plugin (Statistics -> Setup -> Networks Plugins)
- 把 Frewall 給 enable
- 進入 Firewall plugin 的 configuration
- 把兩個 Instance name 改成合法的名字 (我是把空白都改成減號)
- 存檔, 然後 Save & Apply
-
修改 /etc/config/dhcp, 在 config dnsmasq 新增以下一行 (參考 https://github.com/oofnikj/iptmon/issues/14#issue-898727081)
1config dnsmasq 2 ...... 3 option dhcpscript '/usr/sbin/iptmon'
-
修改 /etc/rc.local, 新增3行如下 (參考 https://github.com/oofnikj/iptmon/issues/14#issuecomment-846448672)
1/etc/init.d/dnsmasq restart 2iptmon init 3iptmon flush 4exit 0
-
直接執行上面 3 行指令
-
打開 Statistics -> Graph -> Firewall, 就可以看到 by IP 的報表了.
-
reboot, 確定報表還是有產生出來
有裝 AdGuardHome 要注意, 因為 AdGuardHome 會取代 dnsmasq 變成 Primary DNS server, 但 iptmon 又需要 dnsmasq, 兩者要同時安裝的話要注意.
4. iptmon (Simple iptables bandwidth monitor) + Grafana
呈上面一段, 如果覺得 luci-app-statistics 提供的報表不夠漂亮, 可以再接著把 iptmon 的資料送到 Grafana. 資料流還滿長的 (collectd -> collect network plugin -> Prometheus collectd_exporter -> Prometheus -> Grafana), 因此盡量每一段能測試就測試一下.
-
collectd_exporter 安裝設定 (要找台 PC or Raspberry Pi)
- 安裝 collectd_exporter, 有 docker 的話, 指令如下
1docker pull prom/collectd-exporter 2docker run -d -p 9103:9103 -p 25826:25826/udp prom/collectd-exporter --collectd.listen-address=":25826"
- 裝好之後, 先從 OpenWrt 測試是否有通. 因為是 UDP, 所以用 netcat 測試.
又因為 OpenWrt 內建的 nc 功能比較少, 所以要先裝 netcat, 測完以後如果沒用可以把它移除.
指令如下, 如果沒通, 他會顯示 refused, 如果有通, 他不會顯示東西.
1root@OpenWrt:/# opkg install netcat 2root@OpenWrt:/# echo -n 0 | nc -u -w1 192.168.1.236 25825 3read(net): Connection refused 4root@OpenWrt:/# echo -n 0 | nc -u -w1 192.168.1.236 25826 5 6root@OpenWrt:/# opkg remove netcat
- 安裝 collectd_exporter, 有 docker 的話, 指令如下
-
collectd network plugin 安裝設定 (在 OpenWrt 上設定)
-
在 /etc/collectd/conf.d 新增一個檔案, 譬如 send-to-exporter.conf, 內容如下, IP 請換成跑 collectd-exporter 的機器 (參考 https://forum.openwrt.org/t/74391/13)
注意: send-to-exporter.conf 的檔名可以隨便取, 但必須是 .conf 結尾, 可參考 /etc/collectd.conf 的 Include 設定
1LoadPlugin network 2 3<Plugin "network"> 4 Server "x.x.x.x" "25826" # 這裡放下面執行 collectd_exporter 的 IP 5</Plugin>
-
重啟 collectd (或 reboot)
1/etc/init.d/collectd restart2
-
連線到 http://localhost:9103/metrics => localhost 請改成跑 collectd_exporter 的機器 IP
- 除了一堆 go_*** 和 process_*** 以外, 應該會看到一堆 collectd_*** 開頭的 metrics (看你裝了那些 plugin)
- 如果只有如下兩個 collectd_*** 開頭的 metrics, 那代表資料沒有傳過來 (這兩個是 collectd_exporter 內建的, 不是 OpenWrt 傳過來的), 可參考這裡看看可能的原因 https://collectd.org/wiki/index.php/Troubleshooting
1collectd_exporter_build_info{branch="",goversion="go1.14.2",revision="",version=""} 1 2collectd_last_push_timestamp_seconds 0
-
-
Prometheus 安裝設定 (要找台 PC or Raspberry Pi)
- 假設你已經有一個現成的 Prometheus 了
- 修改 Prometheus.yml, 新增下面這段, 然後重啟 Prometheus
1scrape_configs: 2- job_name: IPTMon 3 static_configs: 4 - targets: ["x.x.x.x:9103"] # 這裡放 collectd_exporter 的 IP
- 測試 (確認 Prometheus 有抓到正確 metrics)
- 在 Prometheus 執行下列指令, 就會顯示出每個 client 最近 5 分鐘的流量
1rate(collectd_iptables_ipt_bytes_total{type !~ "(rx_OpenWrt|tx_OpenWrt|rx_localhost|tx_localhost)"}[5m])
-
整合到 Grafana
這個還可以整合到 Grafana, 可參考 https://github.com/oofnikj/docker-openwrt/tree/master/monitoring https://forum.openwrt.org/t/measure-network-traffic-per-host-via-prometheus/74391/7
5. YAMon (Yet Another Monitor)
-
網站
- 官方網站: https://usage-monitoring.com/index.php
- 官方 GitHub (最後一次更新是 2020/6/24): https://github.com/al-caughey/YAMon-v4
- Forks:
- https://github.com/ecdye/YAMon-v4: 我後來是改用這個, 看來改了很多, 但他自己沒寫甚麼, 我是在這裡看到的 https://github.com/al-caughey/YAMon-v4/issues/39
- https://github.com/Piropa/YAMon-v4-alt: 這就沒測試了
- https://github.com/richard4912/YAMon-v4: 這也沒測試
-
安裝
- 從官方網站安裝 4.0.7 版的方法如下 (以下從這裡抄來的 https://usage-monitoring.com/v4Install+Validate.php)
1wget 'http://usage-monitoring.com/current/YAMon4/Setup/install.sh' -qO /tmp/install.sh 2mkdir /opt 3cp /tmp/install.sh /opt/ 4chmod +x /opt/install.sh 5/opt/install.sh
- 如果要用上面提到的 https://github.com/ecdye/YAMon-v4 更新, 就把直接從 GitHub 下載他的程式, 解壓縮後蓋掉 /opt/YAMon4, 然後執行 setup.sh 就可以了.
- 從官方網站安裝 4.0.7 版的方法如下 (以下從這裡抄來的 https://usage-monitoring.com/v4Install+Validate.php)
-
使用
- 連線到 http://192.168.1.1/yamon/, 第一次可能會有點久, 你會看到一堆目錄 (類似這樣), 就耐心點等他產生出 index.html
6. Prometheus Node Exporter + Grafana
-
這個很有意思, 有人基於 OpenWrt 上的 Prometheus Node Exporter, 修改了一版 Grafana dashboard
-
網站
-
安裝
-
使用
- 但我也真的裝起來了, 報表如下, 不過他主要是看 OpenWrt 的 OS status (因為他是基於 Prometheus Node Exporter), 並不是以每個使用者的流量為主, 唯一有點關係的是這個圖.
類似的還有 https://blog.ja-ke.tech/2019/02/24/openwrt-collectd-influx.html
7. Netdata
- 網站
- 官方網站: https://www.netdata.cloud/
- 官方 GitHub: https://github.com/netdata/netdata
- 安裝
1opkg install netdata
- 使用很簡單, 連線到 http://192.168.1.1:19999/ 就可以了.
但他並沒有 by client 的報表, 似乎要用 nfacct + iptables 才有辦法, 參考 https://github.com/netdata/netdata/issues/954#issuecomment-350350117
8. 其他
- Monitor home network traffic with OpenWRT and Syslog-ng and Elasticsearch Security: 這個滿酷的, 用 Syslog-ng + Elasticsearch + Kibana 來產生報表.
心得
Asuswrt-Merlin 內建的可以看出 Youtube/Netflix/... 的使用量, 這很好用, 但 OpenWrt 似乎找不到相同功能的.
Posts in this Series
- OpenWrt 頻寬管理 (依照 interface)
- OpenWrt 頻寬管理 (依照使用者)
- Fortinet VPN on OpenWrt
- OpenWrt Router Samba
- OpenWrt Router 選擇