Linux-2.6.32内核编译流量计数器nfacct
我的时间为我掌控。这是我最大的財富。早上9点多到公司。一直到下班,这段时间有偿的坐班。我不会预计自己的事情。下班到家直到家人睡去。这段时间有偿的坐班,我不会顾及自己的事情。之后就是急促的喘息的夜,我的愿望刻在上帝的喉咙,希望通过推翻身边的拿人性做抵押的否认之墙,来从容面对恐惧(这是形容死亡金属的)!
好了。受虐自是开端!
且看且珍惜:
Netfilter早在xtables-addons-1.46(更早的版本号我没有亲自试验,因此不便述说)中就内置了一个ACCOUNT模块,用来在iptables的框架内支持流量计数,它的使用方法例如以下:
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。
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
此文件须要改动的地方有:
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
至此,移植空间完毕,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。
你相信吗?旋转升降椅真的会爆炸。
版权声明:本文博主原创文章,博客,未经同意不得转载。
Linux-2.6.32内核编译流量计数器nfacct的更多相关文章
- Linux之增加系统调用[内核编译]
声明:如需引用或者摘抄本博文源码或者其文章的,请在显著处注明,来源于本博文/作者,以示尊重劳动成果,助力开源精神.也欢迎大家一起探讨,交流,以共同进步- 0.0 由于操作系统实验的缘故,有一个实验需要 ...
- Linux 2.6的内核编译过程
由于上课需要,老师指定使用linux-2.6.26内核.本人是菜鸟级别的. 由于本人安装的ubuntu系统中,没有自带GCC,故需要自己安装gcc, 首先启用ROOT权限 输入:sudo -i 获取 ...
- linux内核学习之三:linux中的"32位"与"64位"
在通用PC领域,不论是windows还是linux界,我们都会经常听到"32位"与"64位"的说法,类似的还有"x86"与"x86 ...
- [转载]Linux内核编译
原文地址:https://blog.csdn.net/qq_34247099/article/details/50949720 写在前面的话: 本人大二,东南大学一个软工狗,正在修一门名为<操作 ...
- Ubuntu 编译安装 Linux 4.0.5 内核,并修复 vmware 网络内核模块编译错误
. . . . . 今天把 Ubuntu 14.04 升级到了最新的 4.0.5 的内核版本,本来不打算记录下来的,但是升级的过程中确实遇到了一些问题,所以还是记录下来,分享给遇到同样问题的猿友. 先 ...
- linux内核编译,配置本机驱动
1.前言 编译linux内核失败的原因很多时候就是驱动选错,适合自己本机的驱动没编译进去.面对特殊平台(或者有些洁癖者,我就是^_^),要编译精简内核,只要本机驱动,其他都不需要.面对内核里面这么多 ...
- linux内核编译相关
参考:http://www.arm.linux.org.uk/docs/kerncomp.php 一. 内核编译1) linux 2.4make clean/make mrpropermake dep ...
- 运行在TQ2440开发板上以及X86平台上的linux内核编译
一.运行在TQ2440开发板上的linux内核编译 1.获取源码并解压 直接使用天嵌移植好的“linux-2.6.30.4_20100531.tar.bz2”源码包. 解压(天嵌默认解压到/opt/E ...
- Linux 4.1内核编译报告
编译环境 Arch Linux on VirtualBox 下载内核 https://www.kernel.org/ 下载的内核压缩包,此时的最新内核版本为4.1: 解压包 # tar -xvJf l ...
随机推荐
- 【淡墨Unity3D Shader计划】一间 创建一个游戏场景 & 第一Shader写作
本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨) ...
- 谷歌下解决Pop遮罩层无法遮挡滚动栏下问题
今天用pop的弹出窗体里,出现一个问题,当网页出现滚动栏里,不能遮挡住,解决Pop遮罩层无法遮挡滚动栏下问题. 可通过下载获取改动后的代码----->进入下载
- 教你怎么去一个APP的JSON数据,你懂的
今天闲着没事.谁让我今天是光棍节呢,算给大家一个福利.没事逛着应用市场.想找个应用高仿下,突然发现一个应用竟然跟我一个名字尼玛,尼玛应用界面做的非常easy.我认为应该不难. 惯性操作想去破解APK. ...
- 使用Hamcrest增强JUnit的测试能力
package com.jadyer.service; import java.util.HashMap; import java.util.Map; import org.hamcrest.Matc ...
- 从零开始学Xamarin.Forms(一) 概述
原文:从零开始学Xamarin.Forms(一) 概述 Xamarin 读 "ˈzæmərin",是一个基于开源项目mono的能够使用C#开发的收费的跨平台(iOS.And ...
- php查找字符串是否存在
strstr //搜索字符串在另一字符串中的首次出现(对大小写敏感) //该函数返回字符串的其余部分(从匹配点).如未找到则返回 false stristr //查找字符串在另一字符串中第一次出现的位 ...
- windows phone (27) 基础Button
原文:windows phone (27) 基础Button Button 在wp7中因其灵活性经常会用到,我们在ContentPanel中直接添加Button,button默认状态下是把整个grid ...
- 【iOS开发-22】navigationBar导航栏,navigationItem建立:获取导航栏中的基本文本和button以及各种跳跃
(1)navigationBar导航栏可以被看作是self.navigationController一个属性导航控制器,它可以由点直接表示self.navigationController.navig ...
- (摘录)SQL Server 存储过程
文章摘录:http://www.cnblogs.com/hoojo/archive/2011/07/19/2110862.html SQL Server 存储过程 Transact-SQL中的存储过程 ...
- Java 8 时间日期库的20个使用示例
java 8是如何处理时间及日期的 有人问我学习一个新库的最佳途径是什么?我的回答是,就是在实际项目中那样去使用它.在一个真实的项目中会有各种各样的需求,这会促使开发人员去探索和研究这个新库.简言之, ...