Linux-2.6.32内核编译流量计数器nfacct


近期一直想看的一本书是《一朵桔梗花》,和技术无关的一本书,但是这并不能表达我对IT技术已经没有兴趣。事实证明,当我无法理解生活百态,无法理解肮脏的领导人心理,无法理解自认为自己可怜却处处步步为营的肮脏轨迹,无法理解不干活儿却从来都是显得自己很累,无法理解上位后的沉默寡言,无法理解拉窗帘,无法理解由于寂寥而加班从而博彩,无法理解省去了租住房的电费后又得到了功勋,无法理解.......等等之后,我TMD能蹂躏的就是:把Linux-3.17的功能移植到Linux-0.01上!
iptables -A XXX (any matches) -j ACCOUNT --addr 0.0.0.0/0 --tname $acctname作用是凡是匹配any matches的流量均计入acctname这个计数器。可以通过:
iptaccount -l $acctname来显示流量信息。但是它有一个缺点,那就是ACCOUNT作为iptables的一个target存在,这就是说流量统计之外,一条iptables规则不能再做别的了。有时候,你总是希望流量计数是作为一个“额外”的动作而存在,比如在DROP的同时记录一下,或者在NAT的同时记录一下等。将流量计数作为match会更好,因为match可以有多个!另外,ipset-6.23也支持流量计数,但是本文不谈那个。本文谈的是nfacct。
|-- iptables-1.4.21.tar.bz2

nfnetlink_acct.c:cp $3.3/net/netfilter/nfnetlink_acct.c net/netfilter/nfnetlink_acct.c
1.将include文件nfnetlink.h绝对路径改为相对路径,即本目录。

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
1.将include文件nfnetlink.h绝对路径改为相对路径,即本目录。
nfnetlink.h:cp /lib/modules/`uname -r`/build/include/linux/netfilter/nfnetlink.h net/netfilter/nfnetlink.h
1.定义新的netlink子系统:
#define NFNL_SUBSYS_IPSET 6 #define NFNL_SUBSYS_ACCT 7 #define NFNL_SUBSYS_COUNT 8注意,移植此文件到当前编译目录的目的是为了不影响系统头文件,要知道,由于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:
#define xt_action_param xt_match_param这是因为2.6.32中match和target在接口上是分开的,不像3.X内核上将其作为union封装进xt_action_param结构体。
2.改变checkentry的返回值:
/* 万分注意!从3.x移植过来的checkentry的返回值是int,0为成功,非0为失败, * 然则2.6.32的对应返回值是bool,0为失败,非0为成功。 * 完全相反的API规范,弄反了就panic吧 :( **/ static int nfacct_mt_checkentry(const struct xt_mtchk_param *par) { struct xt_nfacct_match_info *info = par->matchinfo; struct nf_acct *nfacct; nfacct = nfnl_acct_find_get(info->name); if (nfacct == NULL) { pr_info("xt_nfacct: accounting object with name `%s' " "does not exists\n", info->name); return 0; } info->nfacct = nfacct; return 1; }
xt_nfacct.h:cp $3.3/include/linux/netfilter/xt_nfacct.h net/netfilter/xt_nfacct.h
obj-m += nfnetlink_acct.o obj-m += nfnetlink.o obj-m += xt_nfacct.o进入net/netfilter目录,通过下面的命令编译:
make -C /lib/modules/`uname -r`/build SUBDIRS=`pwd` modules然后依次加载nfnetlink.ko,nfnetlink_acct.ko,xt_acct.ko
nfacct add test
iptables -A INPUT -s 192.168.0.0/24 -m nfacct --nfacct-name test -j ACCEPT
停顿片刻,保持网络传输,查看流量计数器:
nfacct get test { pkts = 00000000000000188016, bytes = 00000000000250825515 } = aa;OK了!
你相信吗?旋转升降座椅真的会爆炸。

相关内容