利用iptables实现基于端口的网络流量统计

如何统计某个应用的网络流量(包括网络流入量和网络流出量)问题,能够转换成如何基于端口号进行网络流量统计的问题。大部分网络应用程序都是传输层及以上的协议,所以基于端口号(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

相关文章
相关标签/搜索