發新話題

使用 iptables 統計傳輸量

使用 iptables 統計傳輸量

Linux 內建的封包過濾機制除了可以架設 NAT、防火牆外, 可能只有少數人知道它也具備傳輸量統計的功能, 本節將說明其運作的機制, 以及如何使用iptables 指令, 統計特定 IP 或通訊埠的傳輸總量。

核心內建的傳輸量統計機制

當核心的網路功能開始運作後, 便已經開始統計傳輸量了, 您可以如下使用 iptables 指令觀察目前統計狀況:

[root@free ~]# iptables -L -vn

"-L" 參數列出鏈中的規則, 因為沒有指定鏈名, 所以預設列出 filter 鏈的規則
"-v" 參數將顯示完整的資訊, 以便觀察傳輸量統計的狀況, 一般不使用"-v "參數時, 只會顯示如來源位址等簡要的資訊
"-n" 參數設定 iptables 不要將 IP 反查為網域名稱

Chain INPUT (policy ACCEPT 35463 packets, 2608K bytes)
  pkts bytes target prot opt in out source destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
  pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 45808 packets, 65M bytes)

"45808 packets"從開機至今已經有 45808 個封包通過 OUTPUT 鏈
"65M bytes"總計 65M bytes 的傳輸量通過 OUTPUT 鏈

  pkts bytes target prot opt in out source destination

當傳輸量較大時, iptables 預設會以 K、M、G 等單位來顯示傳輸量, 與一般的計算不同, 這些單位分別代表 1000、1,000,000 與 1,000,000,000 bytes。就閱讀上, 使用這些單位能讓我們更容易地判斷數量大小, 但是未來如果以程式統計傳輸總量, 使用較精確的數字才能方便地進行數字的比較。此時可以如下使用 "-x" 參數, 強迫 iptables 顯示精確的傳輸量:

[root@free ~]# iptables -L -vxn  ←加上 "-x" 參數

...

Chain OUTPUT (policy ACCEPT 58388 packets, 74888452 bytes)

"74888452 bytes"共有 74888452 bytes 的傳輸量通過 OUTPUT 鏈

  pkts bytes target prot opt in out source destination

計量器的運作方式

核心所內建的傳輸量統計機制, 主要是依靠計量器 (counter) 來進行統計的工作。每一個 iptables 規則都伴隨著一組計量器, 當封包符合 iptables 內的某一個規則時, 核心便會將封包大小與數量累加於該規則所屬的計量器。

以下將以實例說明計量器的運作方式, 筆者於 free 主機執行下面指令, 在 iptables 中新增一條規則:

[root@free ~]# iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT

於 OUTPUT 鏈中設定凡是 TCP 協定, 來源埠號為 80 的封包皆可允許通過

上面規則設定 free 主機 HTTP 伺服器發出的封包皆予放行, 此處並不是設定防火牆進行連線阻擋, 所以姑且不討論該規則是否有意義。新增規則後可執行下面指令, 列出目前所有規則:

[root@free ~]# iptables -L -vxn

...

Chain OUTPUT (policy ACCEPT 58539 packets, 74901820 bytes)

OUTPUT 鏈預設的原則是允許封包通過, 這也是一個 『規則』, 所以也有一個計量器

pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp spt:80

"0 0 "此為伴隨著新規則的計量器
"0 tcp spt"這是剛才新增的規則

新規則的計量器會記錄所有來源埠號為 80 的封包, 所以可用來統計 HTTP 伺服器的外送傳輸量。筆者從其他主機使用瀏覽器, 下載 free 主機一個大小為 30 Mbytes 的檔案, 完成後如下觀察傳輸量的統計情形:

[root@free ~]# iptables -L -vxn
Chain INPUT (policy ACCEPT 98068 packets, 5555372 bytes)
pkts bytes target prot opt in out source destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source  destination

Chain OUTPUT (policy ACCEPT 58539 packets, 74901820 bytes)

有 74888452 bytes 的傳輸量通過 OUTPUT 鏈

pkts bytes target prot opt in out source destination
20883 31318041 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp spt:80

"31318041"共有 31318041 bytes 的傳輸量通過此規則
"0 tcp spt"這是剛才新增的規則

上面可以看到通過 OUTPUT 鏈的傳輸量為 74888452 bytes, 與未下載檔案之前相同, 反而是新規則的計量器中, 傳輸量由 0 增加為 31318041 bytes, 與被下載的檔案大小相仿, 所以剛才下載檔案的傳輸量, 全部被記錄在新規則的計量器中, 而 OUTPUT 鏈的計量器則維持不變。於是筆者再多次進行下載, 發現傳輸量確實只記錄於新規則:
[root@free ~]# iptables -L -vxn
...
Chain OUTPUT (policy ACCEPT 59158 packets, 74957780 bytes)
pkts bytes target prot opt in out source destination
62649 93954123 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp spt:80

傳輸量只記錄於此規則的計量器中

為了研究這個狀況, 筆者再次於 free 主機如下新增一個規則 (為了解說上的需要, 隨後說明時, 將這個最新規則稱為規則 2, 剛才增加的稱為規則 1):

[root@free ~]# iptables -I OUTPUT
-p tcp --sport 80 -d 192.168.0.32 -j ACCEPT

於 OUTPUT 鏈的第一行插入一個規則, 設定 凡是 TCP 協定, 來源埠號為 80, 目的位址為 192.168.0.32的封包皆可允許通過

然後筆者在 192.168.0.32 主機使用瀏覽器, 下載 free 主機上大小為 30 Mbytes 的檔案, 完成後如下觀察傳輸量統計狀態:

[root@free ~]# iptables -L -vxn
...
Chain OUTPUT (policy ACCEPT 59400 packets, 74981620 bytes)
  pkts bytes target prot opt in out source destination
20884 31318081 ACCEPT tcp -- * * 0.0.0.0/0 192.168.0.32 tcp spt:80←這是最新增加的規則 2

"31318081"傳輸量被記錄於規則 2 的計量器

62649 93954123 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp spt:80←這是原先的規則 1

"93954123"規則 1 的計量器維持不變

由此可以發現, 傳輸量只會被紀錄於單一計量器中, 也就是符合該連線的第一個規則才會統計其傳輸量

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。