如何統計某個應用的網絡流量(包括網絡流入量和網絡流出量)問題,能夠轉換成如何基於端口號進行網絡流量統計的問題。大部分網絡應用程序都是傳輸層及以上的協議,所以基於端口號(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