天天看點

Linux-2.6.32核心編譯流量計數器nfacct

近期一直想看的一本書是《一朵桔梗花》,和技術無關的一本書,但是這并不能表達我對IT技術已經沒有興趣。事實證明,當我無法了解生活百态,無法了解肮髒 的上司人心理,無法了解自認為自己可憐卻處處步步為營的肮髒軌迹,無法了解不幹活兒卻從來都是顯得自己很累,無法了解上位後的沉默寡言,無法了解拉窗簾, 無法了解由于寂寥而加班進而***,無法了解省去了租住房的電費後又得到了功勳,無法了解.......等等之後,我TMD能蹂躏的就是:把Linux- 3.17的功能移植到Linux-0.01上!

       我的時間為我掌控,這是我最大的财富!早上9點多到公司,一直到下班,這段時間有償的坐班,我不會估計自己的事情,下班到家直到家人睡去,這段時間有償的 坐班,我不會顧及自己的事情,之後就是急促的喘息的夜,我的願望刻在上帝的喉嚨,希望通過推翻身邊的拿人性做抵押的否認之牆,來從容面對恐懼(這是形容死 亡金屬的)!

       好了!受虐自是開端!且看且珍惜:

Netfilter早在xtables-addons-1.46(更早的版本我沒有親自試驗,是以不便述說)中就内置了一個ACCOUNT子產品,用來在iptables的架構内支援流量計數,它的用法如下:

作用是凡是比對any matches的流量均計入acctname這個計數器。可以通過:

來 顯示流量資訊。但是它有一個缺點,那就是ACCOUNT作為iptables的一個target存在,這就是說流量統計之外,一條iptables規則不 能再做别的了。有時候,你總是希望流量計數是作為一個“額外”的動作而存在,比如在DROP的同時記錄一下,或者在NAT的同時記錄一下等。将流量計數作 為match會更好,因為match可以有多個!另外,ipset-6.23也支援流量計數,但是本文不談那個。本文談的是nfacct。

       nfacct是Netfilter的一個項目。我不得不再次怒發沖冠!Netfilter上的凄涼項目不少,nfacct真不算凄涼,但是起碼它在 Linux 2.6.32上是不能用的,事實上,由于nfacct項目根本就沒有内置kernel子產品,也就是說,Netfilter如今隻負責使用者态的子產品,至于 kernel那部分,隻好等Linux kernel的trunk樹給與支援了,而我查了資料後,發現在3.3以及之後的版本才給了nfacct核心态的支援。至于nfacct使用者态的代碼,例 行的configure/make install就可以直接編譯通過并安裝,給人一種它已經可用的假象,但是當你使用nfacct add test的時候,便會報錯:錯誤的參數!

       2.6.32根本就沒有nfacct核心部分的支援,是以netlink報錯。接下來的事就是移植3.3版本的nfnetlink_acct核心子產品到 2.6.32版本核心了。我選擇3.3版本是因為它是離2.6.32版本最近的支援nfacct的核心,雖然核心API可能發生變化,但是起碼移植工作量 可以最小化。

.       在開工之前,我給出我編譯環境的目錄樹結構:

|-- iptables-1.4.21.tar.bz2

|-- kernel

|   |-- net

|   |   `-- netfilter

|   |       |-- Makefile

|   |       |-- nfnetlink_acct.c

|   |       |-- nfnetlinkacct.h

|   |       |-- nfnetlink.c

|   |       |-- nfnetlink.h

|   |       |-- xt_nfacct.c

|   |       `-- xt_nfacct.h

|   `-- README

|-- libnetfilter_acct-1.0.2.tar.bz2

`-- nfacct-1.0.1.tar.bz2

iptables- 1.4.21.tar.bz2是目前最新的iptables版本,2.6.32直接可以編譯安裝,nfacct-1.0.1.tar.bz2是 nfacct的使用者态部分,依賴libnetfilter_acct-1.0.2.tar.bz2,這兩者均可以成功編譯安裝,剩下的就是核心态的工作 了,置于我建立的kernel目錄,其中的檔案來自Linux 3.3核心:

nfnetlink_acct.c:cp $3.3/net/netfilter/nfnetlink_acct.c net/netfilter/nfnetlink_acct.c

此檔案需要修改的地方有:

1.将include檔案nfnetlink.h絕對路徑改為相對路徑,即本目錄。

2.将include檔案nfnetlink_acct.h絕對路徑改為相對路徑,即本目錄的nfnetlinkacct.h

3.将kfree_rcu改為kfree,或者重新定義kfree_rcu

nfnetlinkacct.h:cp $3.3/include/linux/netfilter/nfnetlink_acct.h net/netfilter/nfnetlinkacct.h

nfnetlink.c:cp /lib/modules/`uname -r`/build/net/netfilter/nfnetlink.c net/netfilter/nfnetlink.c

nfnetlink.h:cp /lib/modules/`uname -r`/build/include/linux/netfilter/nfnetlink.h net/netfilter/nfnetlink.h

1.定義新的netlink子系統:

注意,移植此檔案到目前編譯目錄的目的是為了不影響系統頭檔案,要知道,由于nfnetlink子產品要重新編譯,我将nfnetlink也移了過來,它們都是2.6.32核心的檔案。

xt_nfacct.c:cp $3.3/net/netfilter/xt_nfacct.c net/netfilter/xt_nfacct.c

1.定義xt_action_param:

這是因為2.6.32中match和target在接口上是分開的,不像3.X核心上将其作為union封裝進xt_action_param結構體。

2.改變checkentry的傳回值:

xt_nfacct.h:cp $3.3/include/linux/netfilter/xt_nfacct.h net/netfilter/xt_nfacct.h

至此,移植空間完成,Makefile的内容為:

進入net/netfilter目錄,通過下面的指令編譯:

然後依次加載nfnetlink.ko,nfnetlink_acct.ko,xt_acct.ko

如此,再次執行nfacct指令試一下吧:

停頓片刻,保持網絡傳輸,檢視流量計數器:

OK了!

當然,你也可以将結果儲存為xml檔案的格式,在必要時也可以reset計數器的數值為0。

       你相信嗎?旋轉升降座椅真的會爆炸。

 本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1579833

繼續閱讀