OpenWrt 頻寬管理 (依照使用者)

文章目錄

提醒
2022年8月有人用 Grafana+Prometheus 來監控 OpenWrt, 可參考 https://github.com/benisai/Openwrt-Monitoring.

需求

找一個 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. 網站

  2. 安裝指令

    1opkg install nlbwmon
    2opkg install luci-app-nlbwmon
    
  3. 使用

    1. 連線到選單上的 Service -> Bandwidth Monitor (http://192.168.1.1/cgi-bin/luci/admin/services/nlbw)

    2. 基本報表如下

    3. 依照 Protocol 分類的報表

2. wrtbwmon

  1. 網站

  2. 安裝

    這個 package 沒有放上 opkg repository, 得手動安裝, 有人問原因, 但作者沒回. 所以只能手動安裝, 先到下面兩個地方下載最新版的程式.

    執行以下指令

    1opkg install wrtbwmon_1.2.1-3_all.ipk
    2opkg install luci-app-wrtbwmon_2.0.10_all.ipk
    
  3. 使用

    1. 連線到選單上的 Network -> Traffic Status (http://192.168.1.1/cgi-bin/luci/admin/network/usage/details), 報表如下
    2. 他上面的綠色 bar 是即時更新的
    3. 你可以依照 MAC 修改 client 的名字

3. iptmon (Simple iptables bandwidth monitor)

  1. 網站

  2. 安裝

    1. 在這裡下載最新版 https://github.com/oofnikj/iptmon/releases

    2. 執行以下指令安裝

      1opkg install collectd-mod-iptables
      2opkg install iptmon_0.1.6-1_all.ipk  # 請換成你使用的版本
      
    3. 設定 Firewall Plugin (Statistics -> Setup -> Networks Plugins)

      1. 把 Frewall 給 enable
      2. 進入 Firewall plugin 的 configuration
      3. 把兩個 Instance name 改成合法的名字 (我是把空白都改成減號)
      4. 存檔, 然後 Save & Apply
    4. 修改 /etc/config/dhcp, 在 config dnsmasq 新增以下一行 (參考 https://github.com/oofnikj/iptmon/issues/14#issue-898727081)

      1config dnsmasq
      2        ......
      3        option dhcpscript '/usr/sbin/iptmon'
      
    5. 修改 /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
      
    6. 直接執行上面 3 行指令

    7. 打開 Statistics -> Graph -> Firewall, 就可以看到 by IP 的報表了.

    8. 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), 因此盡量每一段能測試就測試一下.

  1. collectd_exporter 安裝設定 (要找台 PC or Raspberry Pi)

    1. 安裝 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"
      
    2. 裝好之後, 先從 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
      
  2. collectd network plugin 安裝設定 (在 OpenWrt 上設定)

    1. 在 /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>
      
    2. 重啟 collectd (或 reboot)

      1/etc/init.d/collectd restart2
      
    3. 連線到 http://localhost:9103/metrics => localhost 請改成跑 collectd_exporter 的機器 IP

      1. 除了一堆 go_*** 和 process_*** 以外, 應該會看到一堆 collectd_*** 開頭的 metrics (看你裝了那些 plugin)
      2. 如果只有如下兩個 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
        
  3. Prometheus 安裝設定 (要找台 PC or Raspberry Pi)

    1. 假設你已經有一個現成的 Prometheus 了
    2. 修改 Prometheus.yml, 新增下面這段, 然後重啟 Prometheus
      1scrape_configs:
      2- job_name: IPTMon
      3    static_configs:
      4    - targets: ["x.x.x.x:9103"]  # 這裡放 collectd_exporter 的 IP
      
    3. 測試 (確認 Prometheus 有抓到正確 metrics)
      1. 在 Prometheus 執行下列指令, 就會顯示出每個 client 最近 5 分鐘的流量
      1rate(collectd_iptables_ipt_bytes_total{type !~ "(rx_OpenWrt|tx_OpenWrt|rx_localhost|tx_localhost)"}[5m])
      
  4. 整合到 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)

  1. 網站

  2. 安裝

    1. 從官方網站安裝 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
      
    2. 如果要用上面提到的 https://github.com/ecdye/YAMon-v4 更新, 就把直接從 GitHub 下載他的程式, 解壓縮後蓋掉 /opt/YAMon4, 然後執行 setup.sh 就可以了.
  3. 使用

    1. 連線到 http://192.168.1.1/yamon/, 第一次可能會有點久, 你會看到一堆目錄 (類似這樣), 就耐心點等他產生出 index.html

6. Prometheus Node Exporter + Grafana

  1. 這個很有意思, 有人基於 OpenWrt 上的 Prometheus Node Exporter, 修改了一版 Grafana dashboard

  2. 網站

  3. 安裝

    1. 參考這篇: How I monitor my OpenWrt router with Grafana Cloud and Prometheus
  4. 使用

    1. 但我也真的裝起來了, 報表如下, 不過他主要是看 OpenWrt 的 OS status (因為他是基於 Prometheus Node Exporter), 並不是以每個使用者的流量為主, 唯一有點關係的是這個圖.

類似的還有 https://blog.ja-ke.tech/2019/02/24/openwrt-collectd-influx.html

7. Netdata

  1. 網站
  2. 安裝
    1opkg install netdata
    
  3. 使用很簡單, 連線到 http://192.168.1.1:19999/ 就可以了.

但他並沒有 by client 的報表, 似乎要用 nfacct + iptables 才有辦法, 參考 https://github.com/netdata/netdata/issues/954#issuecomment-350350117

8. 其他

  1. 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