网络统计每月按 ip 地址分组

网络统计每月按 ip 地址分组

如何在我的 Linux 路由器上按 IP 地址分组获取每月的网络统计信息。

我家里有一个 Linux 路由器,我想按 IP 地址对分组获取每月的网络统计信息,如下所示:

192.168.1.x -> x.x.x.x  ??? Bytes 
y.y.y.y1 -> 92.168.1.y  ??? Bytes

我更喜欢免费软件,也不介意自己做一些开发。我发现我可以使用 TUN/TAP 或 libpcap 来获取数据包。但考虑到性能和进程同步,我需要一些建议。

谢谢。

答案1

使用纯 iptables。

iptables -A FORWARD -s 192.168.1.100
iptables -A FORWARD -s 192.168.1.101
...

然后编写一个脚本,使用 iptables 从 netfilter 读取计数器。

iptables -L FORWARD -vxn                                     
Chain FORWARD (policy ACCEPT 454 packets, 315224 bytes)
    pkts      bytes target     prot opt in     out     source               destination         
     173   140480            all  --  *  *       1.2.3.4        0.0.0.0/0           

并将此脚本放到/etc/cron.monthly/

答案2

ipset create track_hosts hash:net,net family inet hashsize 262144 maxelem 333000 counters comment

如果一个月内条目用完了,请将 333000 增加到更大的数字。

iptables -t raw -I PREROUTING 1 -j SET  --add-set track_hosts src,dst

您还可以添加-i eth01 和 -j 之间将其限制为 1 个网络适配器。


ipset save track_host 

会立即有结果

add track_hosts 192.168.3.220,192.168.3.2 packets 1 bytes 60
add track_hosts 192.168.3.251,192.168.3.2 packets 1 bytes 1356
add track_hosts 192.168.3.248,233.89.188.1 packets 1 bytes 186
add track_hosts 192.168.3.222,192.168.3.2 packets 1 bytes 40
add track_hosts 192.168.3.248,239.255.255.250 packets 1 bytes 441
add track_hosts 192.168.3.249,255.255.255.255 packets 1 bytes 186

如果重启后没有保存,统计数据就没有任何用处。

如果您的路由器有 systemd:请注意更改文件路径以满足您的需要 -f /src/all.txt

[Unit]
Description=IP sets for iptables
After=ufw.service
Before=network.target
Before=iptables.service
Before=webmin-iptables.service
AssertPathExists=/src/all.txt

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=-/bin/echo 'Loading ipset sets'
ExecStart=/sbin/ipset restore -f /src/all.txt
ExecStop=/sbin/ipset save -f /src/all.txt
ExecStartPost=-/bin/echo 'Saving ipsets to disk'
#ExecReload=/usr/libexec/ipset/ipset.start-stop reload
# Save current ipset entries on stop/restart.
#   Value: yes|no,  default: no
# Saves all ipsets to /etc/sysconfig/ipset if ipset gets stopped
Environment=IPSET_SAVE_ON_STOP=yes IPSET_SAVE_ON_RESTART=no
ReadWriteDirectories=/src
NoNewPrivileges=yes

[Install]
WantedBy=basic.target

请先更改路径。恢复 iptables 可以这样进行

[Unit]
Description=IPtables load rules
DefaultDependencies=no
After=ipset.service network-pre.target
Before=network-online.target network.target

[Service]
Type=oneshot
ExecStartPre=-/bin/echo 'Starting iptables'
ExecStart=/usr/sbin/iptables-restore /etc/webmin/firewall/iptables.save
ExecReload=/usr/sbin/iptables-restore /etc/webmin/firewall/iptables.save
#ExecStop=/usr/lib/systemd/scripts/iptables-flush
ExecStopPost=-/bin/echo 'Flushing iptables'
RemainAfterExit=yes
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW

[Install]
WantedBy=basic.target

现在只剩下一个 cronjob 来

ipset save -f /somewhere/month-year && ipset --flush track_hosts

前半部分保存统计数据,后半部分清除统计数据,以重新开始新的月份。当然,如果你不想清除,也可以不清除。

您可以像这样按照您想要的方式解析输出。

ipset save track_hosts|sed 's/.*track_hosts //'|sed 's/,/ -> /'|sed 's/packets [0-9].//'

cat month-year|sed 's/.*track_hosts //'|sed 's/,/ -> /'|sed 's/packets [0-9].//'

最终结果:

192.168.3.220 -> 192.168.3.2 bytes 60
192.168.3.2 -> 239.255.255.253 bytes 105
192.168.3.251 -> 192.168.3.2 bytes 1356
192.168.3.248 -> 233.89.188.1 bytes 186
192.168.3.222 -> 192.168.3.255 bytes 78
216.17.8.11 -> 192.168.3.2 bytes 40
192.168.3.222 -> 192.168.3.2 bytes 40

相关内容