分享
 
 
 

统计分析师—Linux路由器流量统计系统

王朝system·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

本文首先概述三种常用的Linux路由器计费方式,然后详细介绍Linux系统的Netfilter包过滤技术,并在此基础上探讨以Netfilter为核心开发的高效、低负载、可扩展的流量统计系统。

Linux路由器的计费方式

由于Linux系统的稳定性、可用性越来越高,基于Linux系统的路由应用也越来越广泛。无论是对于纯IP转发应用,还是基于NAT技术及透明代理技术的Linux路由器系统,如何高效、准确地进行计费都是一个值得研究的课题。

在Linux的世界里,解决问题的办法往往不止一种。目前常用的Linux路由器计费方式有以下三种:

1. 基于数据链路层的、网络监听模式的计费。

使用专门的网络监听主机,此时主机处于混杂模式(Promiscuous),对流经的数据包进行监听和计费,监听的主机必须与路由器处在同一个广播段。由于监听高速以太网会产生严重的丢包问题,故此方法应用并不广泛。

2. 基于SNMP技术的计费。

通过在Linux路由器上配置SNMP代理进行流量统计。此方法应用较为广泛,但SNMP代理的安装会增加路由器的负载,并带来相关的安全性问题。

3. 使用第三方软件,如xtacacsd等。

基于Linux内核的Netfilter技术

Netfilter是Linux下的包过滤软件系统,目的是实现完整的包过滤、防火墙和网络地址翻译(NAT)等功能。其原理基于检查数据包的头部,并根据规则进行处理,实现数据包的控制、安全、伪装、分割管理。具体实现是通过加载内核模块iptables_filter.o和命令iptables来操作。

Netfilter内建三个表,其功能如表1所示。

表1 Netfilter的组成

默认情况下,数据包从某网络进入Linux路由器所经过的Netfilter过程如图1所示。

图1 Netfilter的数据包路由

1.当一个数据包进入(如网络1),内核首先检查包的目的地(路由决策)。

2.如果它是进入本机的,包会向图的下方移动,到达INPUT链。在这里,任何等待该包的进程都会收到它。

3.否则,如果内核未被允许转发,或者不知道如何转发该包,它就会被丢弃。如果允许转发,而且包的目的地是另一个网络接口(如网络2),那么包继续向图的下边行进,到达FORWARD链。如果策略允许通过(ACCEPT),它将被送出。

4.服务器上的进程也可以发送网络包,这些包直接通过OUTPUT链发送,如果被允许(ACCEPT),那么该包继续向可到达其目的地的网络接口发送。

“nat表”管理网络地址翻译,其中PREROUTING链可定义进行目的地址NAT的规则。因为路由器进行路由时只检查数据包的目的IP地址,所以为了使数据包能正确路由,必须在路由之前就进行目的NAT。POSTROUTING链用来定义进行源地址NAT的规则,系统在决定数据包的路由以后才执行该链中的规则。OUTPUT链定义对本地产生的数据包的目的地址NAT规则。

除了内建链,Netfilter还支持用户自建链,支持更复杂、功能更强的应用。

计费规则

根据Netfilter可扩展表链的特性,可以通过自定义链来实现对数据包的流量计费。从网络管理的角度考虑,需要关注的流量一般是总流入流出及一些基本的网络应用流量,如FTP、WWW、SMTP、POP等,更多的监控可以根据需要添加。

iptables的流量计费功能在同一链内只能实现一次,因此自定义表必须精心设计,保证目标数据包经过计费链。首先建立用户自定义表ACC-IN、ACC-OUT、ACC-OUT-SMTP、ACC-IN-POP3、ACC-IN-WWW、ACC-IN-FTP。

对于Linux路由器,往往需要实现IP伪装与透明代理,其计费链与传统的包转发路由器有所不同。对于IP伪装(网络地址翻译),第一个分组IP包经过PREROUTING(nat)链,此后所有的IP包均经过FORWARD(filter)链,因此实际上对NAT的计费是在FORWARD链上完成的。对于透明代理,其实质是将用户HTTP的80端口请求转发到代理服务进程,如果代理服务进程在本地,则相应的流量发生在本地的OUTPUT链。

流入量统计的iptables表与用户自定义表的顺序关系如图2。

图2 计费表的顺序关系

如图2所示,每一个流入的IP包都会遍历所有的计费链,流出图与之类似。如果IP包符合计费规则,则iptables记数,相应的规则如表2示。

表2 计费类型说明

◆ 对于总流入,由于是在本地网络流入计费,所以本地的TCP流量可以忽略,相应的规则如下(eth0为内网网卡,内网为10.0.0.0/24):

#iptables -A FORWARD -o eth0 -s ! 10.0.0.0/24 -s *.*.*.* -j ACC-IN

◆ FTP流量包括20、21端口,由于21端口只负责FTP控制信令传送,故只需对负责数据传送的20端口计费即可:

#iptables -A ACC-IN -o eth0 -p tcp --source-port 20 -d *.*.*.* -j ACC-IN-FTP

◆ WWW流量如果不设置透明代理,则计费发生在FORWARD链:

iptables -A ACC-IN -o eth0 -p tcp --source-port 80 -d *.*.*.* -j ACC-IN-WWW

◆ 对于使用透明代理的流量,计费发生在OUTPUT链(其中10.x.x.x为内网IP,X为代理进程的端口号):

iptables -A OUTPUT -o eth0 -p tcp -s 10.x.x.x --source-port x -d *.*.*.* -j ACC-IN-WWW

其它协议的计费方式类似。对于任意的TCP及UDP协议,只要知道服务端口号,都可以进行计费。

实际的计费规则采用PERL自动生成。首先生成需要计费的IP地址列表文件,然后通过PERL程序读取该文件并自动生成计费规则。程序示例如下:

sub set_iptables_rules{

my(@mylist)=@_;

open (FILE,$mylist[0]); #读取配置文件

@lines=;

close FILE;

foreach $address(@lines)

{

chomp($address); #处理配置文件

@address_var=split(/ +/,$address);

#根据配置文件生成计费规则

`$iptables $mylist[2] FORWARD -i $local_nic -s $address_var[0] -d ! $local_net -j ACC-OUT`;

`$iptables $mylist[2] ACC-OUT -i $local_nic -p tcp -s $address_var[0] --dport 25 -j ACC-OUT-SMTP`;

...... }

}

Linux路由器的防火墙规则也基于iptables进行设置,主要是针对INPUT链和FORWARD链。计费规则也使用了iptables的系统默认链FORWARD和OUTPUT,与防火墙设置的FORWARD链上出现重叠。因此要保证在FORWARD链上的计费规则必须先于防火墙规则,才能使计费规则与防火墙规则同时发生作用。

系统结构

整个流量计费系统的结构如图3示,数据包流经Linux路由器并被计费;统计数据送入数据库;用户通过前端界面查询流量,同时可对计费规则进行监控和管理。

图3 系统结构示意图

系统的后台程序

iptables的计数功能仅仅提供了简单的流量显示,使用参数iptables -nvxL可得到更多的流量详细数据。例如:

Chain FORWARD (policy ACCEPT 28951 packets, 18212425 bytes)

pkts

bytes target

prot opt

in

out

source

destination

116

8465

ACC-OUT

all

--

eth0

*

10.2.229.2

!10.0.0.0/8

134

59582 ACC-IN

all

--

*

eth0 !10.0.0.0/8 10.2.229.2

一个切实可用的计费系统需要数据库的支持,并提供友好的查询界面,必须在后台对iptables提供的数据进行处理,并且输入至数据库。使用PERL语言的正则表达式,可以对iptables输出的数据进行处理,以选取需要的数据段。对于每一行数据都要提取流量及IP地址,所以要对目的数据段用正则表达式进行处理:

for ($i=0;$i

{$lines_in[$i]=~/^\s+\d+\s+(\d+)\s+(\D+\d)\s+(\W\d+\.\d+\.\d+\.\d+\/\d+)(\d+\.\d+\.\d+\.\d+).*$/;

$ac_ip=$4;

$ac_in=$1; #读取IP地址与总流量

......

#将流量记录输入至数据库

$sth = $dbh-do ("INSERT INTO $mysql_table_name

(date,ip,acc_in,acc_out,acc_in_ftp,acc_in_pop3,acc_in_www,acc_out _smtp)

VALUES ('$date','$ac_ip','$ac_in','$ac_out','

$ac_in_ftp','$ac_in_pop3','$ac_in_www','$ac_out_smtp')"); }

计费周期可根据需要选择,但必须兼顾存储量与效率。这里计费周期选取为24小时,即设定系统的crontab,定时每天执行后台程序将流量输入数据库。计费完成后将流量记数器清零:

#iptables -Z FORWARD

计费后台程序由于采用PERL语言编写,程序紧凑高效,与SNMP计费方式相比,实现方法简单,可定制性强,而且每天执行一次,对Linux路由器没有增加额外的负载。

数据库与前端实现

由于Linux路由器承担大量用户的IP包转发任务,负载较重,为了避免对其性能的影响,后台数据库不设置在本地,而采用多台路由器使用同一后台MySQL数据库来进行管理。

前台查询界面则可采用PHP语言编写,提供给用户日流量、月流量、年流量的查询,同时可对计费策略进行监控和管理,如图4示。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有