/* 万分注意!从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
至此,移植空间完成,Makefile的内容为:
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命令试一下吧:
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了!
当然,你也可以将结果保存为xml文件的格式,在必要时也可以reset计数器的数值为0。
Ubuntu 13.10 (Saucy Salamander) 内核已升级至 Linux Kernel 3.10 RC5
Linux Kernel 3.4.62 LTS 现已经提供下载