利用iptables實現基於端口的網絡流量統計


如何統計某個應用的網絡流量(包括網絡流入量和網絡流出量)問題,可以轉換成如何基於端口號進行網絡流量統計的問題。大部分網絡應用程序都是傳輸層及以上的協議,因此基於端口號(tcp, udp)統計網絡流量基本能覆蓋到此類需求。

利用iptables實現基於端口的流量統計是一種比較簡單可行的方案。它可以對流經每一條規則的包數量和流量進行計數。例如要對常規的Web服務器進行流量統計,可以設置如下規則:

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。

利用iptables規則統計網絡流量可以保證應用在關閉重啟后統計數據不丟失,但是對於主機重啟的情況,它就無能為力了,因為默認情況下主機重啟 iptables規則會清空,即使使用開機任務等方式重建iptables規則,流量計數器也會清零。解決此類問題一個變通的方法是定期將網絡流量值保存 到文件,並清0重新計數,定期更新的時間越短,機器重啟造成的流量計數丟失問題影響越小(特別涉及計費相關的業務)。

創建一個crontab任務,定期將流量統計追加至文件,例如:

1
root@debian:~# iptables -vxn -L >> file

也可以選擇直接將流量值追加到文件:

1
root@debian:~# iptables -vxn -L | awk '{print $2}' >> file

當寫入文件成功后,記得將流量值清0:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM