如何统计某个应用的网络流量(包括网络流入量和网络流出量)问题,能够转换成如何基于端口号进行网络流量统计的问题。大部分网络应用程序都是传输层及以上的协议,所以基于端口号(tcp, udp)统计网络流量基本能覆盖到此类需求。html
利用iptables实现基于端口的流量统计是一种比较简单可行的方案。它能够对流经每一条规则的包数量和流量进行计数。例如要对常规的Web服务器进行流量统计,能够设置以下规则:bash
1 2 |
root@debian:~# iptables -A INPUT -p tcp --dport 80 root@debian:~# iptables -A OUTPUT -p tcp --sport 80 |
第一条规则表示,在INPUT链上添加一条规则,该条规则对全部来自外部网络的、与本机80端口通讯的请求有效,即网络流入量,第二条规则则相反, 它用于统计从本机80端口发出的网络流量,即网络流出量。由于咱们的目的是统计流量,故此处能够省略ACCEPT或DROP之类的动做。服务器
查看流量计数时,只要加上-nvx参数便可:网络
1 2 3 4 5 6 7 8 9 10 11 |
root@debian:~# iptables -nvx -L Chain INPUT (policy ACCEPT 320 packets, 33045 bytes) pkts bytes target prot opt in out source destination 0 785 tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 311 packets, 33711 bytes) pkts bytes target prot opt in out source destination 0 1252 tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp spt:80 |
iptables的-vx参数表示详细信息,能够以字节为单位显示包数量和网络流量,-n参数表示以数字方式表示ip地址和端口号等,不加的话 iptables会默认将ip反解为主机名,例如127.0.0.1用localhost表示,端口号显示为协议号,例如80显示成http, 5672显示成amqp。tcp
利用iptables规则统计网络流量能够保证应用在关闭重启后统计数据不丢失,可是对于主机重启的状况,它就无能为力了,由于默认状况下主机重启 iptables规则会清空,即便使用开机任务等方式重建iptables规则,流量计数器也会清零。解决此类问题一个变通的方法是按期将网络流量值保存 到文件,并清0从新计数,按期更新的时间越短,机器重启形成的流量计数丢失问题影响越小(特别涉及计费相关的业务)。spa
建立一个crontab任务,按期将流量统计追加至文件,例如:.net
1 |
root@debian:~# iptables -vxn -L >> file |
也能够选择直接将流量值追加到文件:code
1 |
root@debian:~# iptables -vxn -L | awk '{print $2}' >> file |
当写入文件成功后,记得将流量值清0:htm
1 |
root@debian:~# iptables -Z |
-Z参数支持指定链名称和规则索引号,例以下列命令表示清空INPUT链的第一条规则的流量计数器。索引
1 |
root@debian:~# iptables -Z INPUT 1 |
Reference:
[1] iptables man page: http://ipset.netfilter.org/iptables.man.html.
转载:
http://fengchj.com/?p=2003