Netfilter/Iptables入门

Linux的内核是由www.kernel.org这个组织负责开发维护,下面我们要讨论的Netfilter/iptables是www.netfilter.org组织为Linux开发的防火墙软件。由于Linux是非常模块化的,很多功能都是以模块加载扩充系统功能,Netfilter同样采用这种方式存在于Linux中。如果你理解了Linux模块加载也就能够理解Netfilter的模块加载方式。大家在 /lib/modules/kernel_version/kernel/net/ipv4/netfilter/目录下能够看到很多以“.ko”为扩展名的文件,哪里存放的就是已经编译好的模块文件。

学习Iptables首先需要学习者具备TCP/IP的基本概念、封包在网络中如何传送,有什么限制,尤其是TCP和IP包头结构以及TCP、UDP和Socket有什么关系,理解这些内容是学习本章的基础。

1. Netfilter的功能

如果你到Netfilter模块目录仔细查看会发现各种功能的模块,这些模块仅是提供某些过滤功能,如果想让Netfilter为我所用,还需要赋予它执行的“规则”,定出了规则后,Netfilter才知道哪些数据包通过,哪些数据包阻止,又有哪些数据包被置换处理。根据功能划分,Netfilter分为Filter、NAT、Mangle和RAW四个功能,由这四个功能也派生出了四张表,其主要功能如下:

Filter:其主要功能是进行数据包过滤。

NAT(Network Address Translation):IP地址转换,主要解决上网问题。

Mangle:其主要功能是修改防火墙封包。

RAW:其功能是加快数据包通过防火墙的速度,以提高防火墙性能。

注意:这四个表按使用平率从多到少依次是这么排的,但是按表的处理优先级,是这样:Raw > Mangle > Nat > Filter。

1. 1 理解Filter机制

首先,我们看下面的一个例子,在客户机上通过Firefox访问,远端Apache服务器上的Web页面,像这样个平常操作中对于Netfilter有这三种封包类型,而这就是Filter的关键机制。

clip_p_w_picpath002

图 封包类型

INPUT类型

当客户机访问Web 服务器的httpd进程时,对于Web服务器而言,属于入站的包,换句话所就是网上其他主机送给本机httpd进程的封包,这里把它定义为INPUT类型封包(图中红色箭头)。

OUTPUT类型

与INPUT相反,由Web服务器的httpd进程链接到客户机上的这类封包就属于OUTPUT类型(图中的绿色箭头),也就是本机httpd进程所产生的封包。

FORWARD类型

在图中,路过Web服务器的封包,就属于FORWARD类型。在什么情况下会产生这种类型封包?我们拿Linux当做路由器使用时就会有FORWARD类型封包产生。

有了上面的基本概念,下面开始讨论过滤表,Filter Table有三个链(Chain),所谓链大家可以形象的理解为自行车中的链条,它是环环相扣的,封包在网络上传送也是如此。

clip_p_w_picpath004

Filter 表结构

上图中系那是了Filter表的结构,你会发现这不就是三种封包类型吗?下面详细分析一下:

INPUT:为了理解这一问题,我们还是拿个实例进行分析,例如我们要保护Web服务器的httpd进程,在三种封包类型中,应该注意哪一种呢?肯定是INPUT类型封包,那么你需要将用来过滤INPUT类型的封包写到INPUT链的规则之中。这样就能起到保护httpd进程的目的。广而言之,INPUT链就是用来存放过滤INPUT类型封包的规则,常用在保护本机的情况下。

OUTPUT:还是接着上面的访问网站的实例讲解,如果打算限制客户机不能浏览www.website.com网站,我们该限制那一种封包?大家能猜出是OUTPUT类型封包,没错。我们可以在OUTPUT链中写入“如果封包由httpd进程产生,并发往错误!超链接引用无效。口,就将封包丢弃”这段伪代码,这样就达到限制网络的链接行为。所以OUTPU链就是用来存放过滤INPUT类型封包的规则,常用于限制本机进程的网络链接。

FORWARD:在上图中linux服务器作为路由器使用,用来保护远端的一台Web服务器,那么应该限制那类封包类型?肯定是FORWARD类型,也就是说FORWARD链用来保护防火墙后面的服务器。

由于Filter机制非常复杂,为了大家容易的理解,用了一个简单的示意图表示Filter原理,注意图中路由表虽然画了两个,但实际只有一个,也就是我们在系统中用“route –n”看到的内容,路由表决定了封包的传送路径,尤其在多网卡的系统中尤为重要。本地进程就是上面所述的Web服务器进程,大家可以理解为httpd进程。

clip_p_w_picpath006

图 Filter原理图

接下来,以三种不同的场景来说明网络封包在Filter机制中被处理的过程。

1) 在上网时,客户机连接服务器,也就是网络封包的目的地是Web服务器的httpd进程,封包首先送到路由表,并有路由表的内容决定传输路径。既然客户机是访问Web服务器上的页面,也就是封包是送给本地进程httpd的,因此封包被送入INPUT链,这是如果INPUT链如果让过,封包就会被送入本地进程,不让过就被丢弃(Drop掉)。

2) 当服务器返回结果,需要链接客户机进程,这是由本地进程httpd往外传送封包,首先封包会被传送如入路由表,由这里的内容决定封包传输路径,接着被送入OUTPUT链,如果允许则出站,如果不允许丰碑就会被丢弃(Drop掉)。

3) 当Linux系统作为防火墙部署,当做网关式防火墙使用,当封包要通过防火墙,首先入站进入路由表,由路由表判断,封包是要由另一个NIC口送出,封包就会送入FORWARD链,此时如果FORWARD链里的规则不许封包通过,那么直接丢弃。反之封包出站离开防火墙。

2. 规则匹配过程

在介绍了Filter工作原理之后接下来讲解封包在每个链中如何匹配,这个概念也非常重要。还是以上图加以说明,实际应用中每个链中包含的规则数量不尽相同,无论那一个Filter表其匹配原则都是“First Match”,即优先执行。当我们在防火墙上添加的新规则被逐条加入到INPUT链中,被顺序编号,例如rules1、rules2等。当封包进入INPUT链之后,Filter机制会以这个封包的特征从INPUT链内的第一条规则逐一向下匹配,如果封包进来遇到第一条规则允许通过,那么这个封包就会进入到本地进程httpd,而不管下面的rule2、rule3的规则是什么都不重要;相反如果第一条规则说要丢弃,即便是rule2规则允许通过也不起任何作用,这就是“first match”原则。

在使用规则是大家要注意一个原则,尽量减少不必要的规则,因为当封包进入防火墙后会在特定的链里逐一被对比,规则条数越多,封包在防火墙中滞留的时间就越长,防火墙性能就会降低。

防火墙规则顺序也会影响其工作效率,例如客户端通过Linux防火墙收取外网邮件, 客户端使用程序为Outlook,使用的是Pop3协议。防火墙规则如下:

1. iptables -A INPUT -p tcp --syn -m state --state NEW --dport 22 -j ACCEPT

2. iptables -A INPUT -p tcp --sync -m state --state NEW --dport 25 -j ACCEPT

3. iptables -A INPUT -p tcp --sync -m state --state NEW --dport 80 -j ACCEPT

4. iptables -A INPUT -p tcp --sync -m state --state NEW --dport 110 -j ACCEPT

5.iptables -A INPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT

当客户段的第一个封包需要花费4次匹配动作,如果一封邮件需要1000个封包的话在加上TCP三次握手的封包这样的匹配的次数达到数万次之多,如果将第四条规则移到第一条那么匹配次数只需1千多次,由此可见规则的顺序对于防火墙性能有着很大影响。所以只要将使用平度最高的规则写在第一个,以后依次类推就好了。

那么,如何确定哪个规则使用频率高或者低呢?可使用下面命令查看:clip_p_w_picpath008

还有特殊情况,封包从INPUT链进来从第一条规则匹配到最后一条都没有匹配成功,怎么办?系统已有考虑,在每个链的最后有一条默认策略,而且这条默认策略总是最后才被匹配,而且这条默认策略的状态只有一种(ACCEPT或DROP),我们假设默认策略为ACCEPT,那么封包这是就可以进入到本地进程,如果为DROP则被默认策略所丢弃。最后强调一点Netfilter的默认策略预设值为ACCEPT,这个也是可以修改的。

3.Iptables实战

Iptables原理难理解,操作命令的参数多,在使用上也比较复杂,我们先不管复杂的语法和繁多的参数,首先看看下面简单的例子应用:

1) 列出Filter表的所有内容

#iptables –t filter -L

clip_p_w_picpath010

2) 清除 Filter表中所有内容

#iptables –t filter –F

3) 在 INPUT链中加入规则

#iptables –t filter –A INPUT –p udp -j ACCEPT

clip_p_w_picpath012

4) 在INPUT链中第二行的位置插入新规则

#iptables –t filter –I INPUT 2 –p tcp –j ACCEPT

clip_p_w_picpath014

注意: 2 代表插入到第二条规则的位置,-p tcp –j ACCEPT为本次要插入的规则,-L参数后面加入—line-number表示可以再规则前显示行号。

5) 删除第二条规则

#iptables –t filter –D INPUT 2

6)将INPUT链中的默认策略改成DROP

#iptables –t filter –P INPUT DROP \\*注意这里字母P为大写\\

看完上述演示,不小心是不是就入门啦,照葫芦画瓢将上面的命令用在其他表上就照样可以哦。下面我们继续讲解。

7)禁止192.168.11.100主机ping我

需要将192.168.11.100发送到本机的ICMP封包丢弃,操作如下:

#iptables –A INPUT –p icmp –s 192.168.11.100 –j DROP

分析:

因为保护对象时本机,所以选择的是INPUT链;

-p icmp 注意是小写。 这里是匹配icmp协议封包,扩展一下” –p tcp”匹配TCP封包,-p udp匹配UDP封包而“-p all”匹配所有协议封包。

-s 192.168.11.100 源IP地址为192.168.11.100,那么如果是目的地址呢就是”-d”,如果目的地是个网址呢“-d www.website.com”,如果是一个网段呢“-d 192.168.11.0/24”就用CIDR形式表示。

-j DROP 符合前面两项条件就DROP掉

8)允许192.168.11.100主机可以ssh登录本机

#iptables –A INPUT –p tcp s0 192.168.11.100 –dport 22 –j ACCEPT

--dport 22 匹配目的端口为22的封包,TCPPort 22为SSH服务端口

-j ACCEPT: 符合前三项条件的封包可进入

9)允许192.168.11.0/24网网段所有主机访问本机192.168.12.1任何服务请求

#iptables –A INPUT –p all –s 192.168.11.0/24 –d 192.168.12.1 –j ACCEPT

10)禁止企业内部主机访问外网

#iptables –A FORWARD –I eth1 –o eth0 –p tcp –dport 80 –j DROP

这里是将linux安装在双网卡服务器上作为防火墙使用,所以肯定使用FORWARD链,eth0接外网,eth1接企业内网。

-i eth1 : 匹配封包进入的接口

-o eth0 :匹配封包离开的接口,结合-i,-o两个参数即可匹配封包的目的传送方向。

-p tcp: 匹配TCP协议的封包

--dport 80 : 匹配目的端口为80的封包,补充一点可搭配“!”来代表反向,如“—sport ! 80”代表匹配不是从Web发送的封包。

-j DROP 符合以上4个条件的封包丢弃

4 Iptables语法

下面不得不讲解语法了,看完以上10个例子相信大家已有了基本概念下面我总结一下:

Iptables 命令格式

Iptables [-t table] command [chain] [rules] [-j target]

大家在看到这一格式时不是是有些眼熟,其实上面很多命令都是按照这个格式来写的。

Table:指定表名,例如filter表,raw表,mangle表,nat表

Command:对链的操作,比如-A表示追加规则,-I表示插入规则

Chain:链名称,比如INPUT链,OUTPUT链,FORWARD链,PREROUTING链,POSTOUTING链

Rules:规则

Target:动作如何进行,也就是理解为处理方式,当前面规则里的条件匹配时如何处理是ACCEPT(通过),还是DROP(丢弃)REJECT(丢弃并回应发送端一个Destination Unreachable的ICMP封包)

Netfilter的NAT原理

NAT是网络地址转换(Network Address Translation)的缩写,主要功能与其说节省公网IP的使用量不如说是可以隐藏内网IP地址。这种技术既可以运用在Server端也可以用在Client端。NAT种类繁多主要有本书主要介绍一对多的NAT使用。

clip_p_w_picpath016

图 NAT原理

NAT工作过程:

下面通过NAT方式,实现企业内网所有主机通过一个公有Ip上网,图例如下图所示。在图中个设备参数说明如下:

? 客户机IP 192.168.11.10

? NAT服务器由Linux的Iptables实现,Linux服务器安装了双网卡。

? eth1接内网,Private Ip为192.168.11.1

? eth0接外网,Public IP为10.0.0.1

? 公网WebserverIP为202.202.202.202

首先,192.168.11.10这台客户机在浏览器输入http://202.202.202.202/,经过以下六步完成显示网页的过程。

第一步,192.168.11.10送出封包给202.202.202.202服务器;

二步,这个封包交给NAT网关处理,接着NAT主机将这收到的封包源地址改成NAT主机的PublicIP;

三步,NAT主机记录下来这个封包,然后将这个封包立即发往202.202.202.202主机;

四步,远端主机202.202.202.202相应给这个主机回应封包,但这次响应的目的端主机为10.0.0.1这个Public IP,而不是客户机的IP;

第五步,这个包被送回到NAT主机;

六步,当NAT主机收到这个封包后,就从之前记录下来的信息中找到最初NAT主机把192.168.11.10转换成10.0.0.1的记录,最后NAT主机把这个封包内的目的IP改成192.168.11.10,最终客户机收到了Web服务器的回应。也就是内网主机借助NAT去访问外网资源。

注意:在第一步到第二步的过程中,封包的源地址改变了,这种变更源地址的过程称为SNAT,而在第五步到第六步中,目的地址呗改变了,同理就被称为DNAT,基本上每种NAT都是由SNAT和DNAT共同搭配而成。

接着上面实例分析,封包由eth1接口进入,经过装换后由eth0离开,封包产生依次为POSTROUTING(源地址转换),Routing Table和PREROUTING(目的地址转换)三种不同机制的变化。如果封包由eth0送入并有eth1送出则顺序相反。所以POSTROUTING和PREROUTING的位置和封包流向有关。

clip_p_w_picpath018

图 封包流向与SNAT、DNAT的关系

查看Nat Table结构命令如下:

#iptables –t nat –L

clip_p_w_picpath020

总结,POSTROUTING是源地址转换,要把你的内网地址转换成公网地址才能让你上网。PREROUTING是目的地址转换,要把别人的公网IP换成你们内部的IP,才让访问到你们内部受防火墙保护的机器。下图介绍了NAT的完整结构。

clip_p_w_picpath022

图 NAT结构

1) PREROUTING

当你想改变封包目的IP时请将规则放置于PREROUTING Chain之内,因为PREROUTING Chain的功能在于执行DNAT。

2) POSTROUTING

POSTROUTING China的功能则是变更封包的源IP,即它主要是执行SNAT任务。值得注意的是它位于整个NAT机制的最末尾,因此我们执行SNAT,源IP变更也是在最后执行。

一对多NAT举例

一对多NAT的应用平时最常用,下面我们看看实际应用,拓扑和配置还是看上图。

在设置这种NAT时,我们的考虑封包进入和出去两个方向,首先考虑由企业内部传送封包到外网的情况,如果192.168.11.0/24网段的主机要访问外网202.202.202.202这台主机,其服务器请求封包内的源IP可定时私有IP,肯定不可能直接送达外网,因此必须由NAT主机上的SNAT机制将外送封包内的源IP改成NAT主机上的PublicIP,这样才能让外网主机响应回的封包可以顺利返回到NAT主机对外的PublicIP上,此SNAt规则写法如下:

#iptables –t nat –A POSTROUTING –o eth0 –s 192.168.11.0/24 -j SNAT –-to 10.0.0.1

注意,放在NAT主机后方的系统并不安全,以一对一的NAT为例,当***从外网***NAT的Public IP地址时,这个***的封包会被转送给NAT后方的主机。要提高安全性还需要和Filter机制相结合才行。

Iptables规则库管理

我们知道iptables的规则被存储在各种不同的链中,相当于一个规则库,当我们修改完规则可用iptables-save命令进行存储。对于ossim系统而言iptables规则存储在/etc/ossim_firewall文件中,每次启动系统时会通过iptables-restore 调用/etc/ossim_firewall文件到内存中。如果是Redhat系统则是用过”service iptables save”命令存储,默认规则路径为/etc/sysconfig/iptables文件内。但是这样管理未必是好事,比如规则库中有100条规则,有80条规则都包含地址192.168.11.10,那么如果需要修改将原来的192.168.11.10改成192.168.12.10,你打算将所有的地址都重新输入一遍吗?那样效率太低了。可建议大家采用脚本管理方式,也就是将规则写入shell脚本,这样可以将ip地址存储变量中

Mangle机制

Mangle表主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等应用,mangle 表对应的内核模块为 iptable_mangle。由于需要相应的路由设备支持,应用并不广泛。注意Mark并没有真正地改动数据包,它只是在内核空间为包设了一个标记,Mangle应用顺序要高于nat、filter。

iptables -F -t mangle # 清除mangle表中,所有规则链中的规则

iptables -t mangle -X # 清除mangle表中,使用者自订链中的规则

RAW机制

RAW表只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW表,在某个链上,RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了.

RAW表可以应用在那些不需要做nat的情况下,以提高性能。如大量访问的web服务器,可以让80端口不再让iptables做数据包的链接跟踪处理,以提高用户的访问速度。

执行如何指令即可

iptables -t raw -A PREROUTING -p tcp --dport 80 -j NOTRACK

iptables -t raw -A PREROUTING -p tcp --sport 80 -j NOTRACK

iptables -A FORWARD -m state --state UNTRACKED -j ACCEPT

Netfilter模块应用范例

封包的匹配是Netfilter筛选封包的基本方式,匹配方法越多,提取出的封包种类就越细致,这样防火墙的保护范围就越大。

举例:

1) 禁止内网用户访问http://www.website.com

#iptables –A FORWARD –p tcp –I eth1 –o eth0 –d www.website.com –j DROP

2) 匹配目的端口

禁止192.168.11.0/24网段内的所有主机访问外网FTP服务,规则如下:

#iptables –A FORWARD –i eth1 –o eth0 –p tcp –s 192.168.11.0/24 --dport 21:22 –j REJECT

如果时匹配源端口呢?只需要将“--dport”改成“—sport”即可。

3) TCP-Flags匹配

为了防范一些非正常封包我们可以利用netfilter过滤tcp-flags状态,我们可以利用—syn来判断封包内含有syn标志。例如:

#iptables –A INPUT –p tcp --tcp-flags ALL SYN,FIN –j DROP

4)MAC地址匹配

一些公司内部是DHCP分配客户机IP,但有时需要制定特定IP才能访问数据库服务器,怎么处理呢?我们可以根据这些指定机器的MAC地址进行过滤假设MS SQL服务器所使用端口为1433,指定的主机网卡MAC地址为00:0c:29:53:ab:60 ,规则如下:

#iptables –A INPUT –p tcp --dport 1433 –m mac --mac-source 00:0c:29:53:ab:60 –j ACCEPT

其中-m mac表示调用xt_mac.ki模块,它的功能是匹配MAC地址。

5. IP地址范围匹配

当你想封锁某个IP地址段的时候不会去一条条IP地址输入吧,Netfiletre中有ipt_iprange.ko模块可以用一条语句解决问题,规则如下:

#iptables –A INPUT –m iprange --src-range 192.168.11.110-192.168.11.150 –j DROP

同样方法,如果需要限制目的地址,那么就需要把”--src-range”换成”--dst-range”即可。

6. TTL值的匹配

生存时间(time-to-live)指定数据包被路由器丢弃之前允许通过的网段数量。它是IP(中文全称:网络协议)协议包中的一个值,它告诉网络,数据包在网络中的时间是否太长而应被丢弃,一般情况下LinuxTTL值为64或255,Windows 2000/XP TTL值为128。

TTL值的匹配是由Netfilter的ipt_ttl.ko模块实现。举例,我们要将TTL值为128的封包丢弃,规则如下:

#iptables –A INPUT –m ttl --ttl-sq 128 –j REJECT

7. 匹配MTU

这个和封包长度有关,MTU是最大传输单元,它是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位),下面以ICMP封包为例讲个特殊场景。

Ping是个常见命令,而在linux下以ping –f –s 16384 1.2.3.4 就会产生大量大型ICMP封包不但占用机器CPU而且占用网络带宽,“-s 16386”会产生出来的ICMP封包所承载的数据大小为16KB,如果用ping –f –s 0 1.2.3.4指令则会产生更多的ICMP请求包。这样一来就会慢慢形成DOS***。

clip_p_w_picpath024

有些朋友想到禁止Ping,会使用以下命令

echo 1 >; /proc/sys/net/ipv4/icmp_echo_ignore_all

有时候搞得自己也不能ping 很不方便,还是使用iptables的xt_length.ko模块好使。

#iptables –A INPUT –p icmp --icmp-type 8 –m length --length 1:99 –j ACCEPT

#iptables –A INPUT –p icmp --icmp-type 8 –m length --length 1000:16386 –j DROP

注意:我们把不符合要求的ICMP type 8封包过滤掉的目的是避免主机受到大量ICMP封包的***。--length 1000:16386表示匹配MTU值介于1000~16386 Bytes的封包

8. 对指定封包重复率的匹配

使用limit的灵活度就比上面的规则强,不是一棍子打死。比方说我希望每分钟有10个ICMP封包就进入,如果超过,那我们就限制每分钟只能进来6个ICMP。实现规则如下:

#iptables –A INPUT –p icmp --icmp-type 8 –m limit --limit 6/m --limit-burst 10 –j ACCEPT

#iptables –A INPUT –p icmp --icmp-type 8 –j DROP

注意:6/m,其中的m代表分钟,后面的—limit-burst 10 表示每分钟进入10个封包,千万别忘记第二条规则,只有两条都输入才起作用。

9. 对封包内承载内容进行匹配

假设外网***者通过发送“./winnt/system32/cmd.exe?/c+dir”***了内网IIS服务器,在服务器漏洞没有完全修复前我们可以尝试在Linux网关防火墙上利用xt_string.ko模块的匹配功能暂时阻止***者再次袭击。规则如下:

#iptables –A FORWARD –I eth0 –o eth1 –p tcp –d 10.0.0.1 --dport 80 –m string --algo bm --string “system32” –j DROP

含义:如果封包要送往IIS Server的80端口,就用string模块匹配,bm代表(Boyer-Morre)算法,如果封包含有 system32字符创就丢弃。不过要注意这只是临时处理方法而不是救命稻草。

10. 对日志的处理

Netfilter默认并不会产生日志,如果需要记录日志就需要用到ipt_log.ko这个模块,下面举例说明,我们要记录曾对本机发出FTP服务请求的IP地址,可使用如下命令:

#iptables –A INPUT –p tcp --dport 21 –j LOG

#iptables –A INPUT –p tcp --dport 21 –j ACCEPT

LOG只会记录封包信息,而不会处理这个封包,LOG是个比较特殊的处理方法,这个封包会继续匹配INPUT链内的其他规则,而LOG所记录下来的日志则会存放在/var/log/messages中,查看方法:

#tail –f /var/log/messages

clip_p_w_picpath026

你在使用中会发现log日志量增长很快,因为LOG会记录每个FTP协议封包的信息。下面我们修改一下,只记录每条连接的第一个分包,这样日志的尺寸就大为减小。

#iptables –A INPUT –p tcp --syn --dport 21 –j LOG

下面接下来的问题就是如何从/var/log/messages中提取LOG,我们可以使用--log-level参数,改进方法如下:

#iptables –A INPUT –p tcp --syn --dport 21 -j LOG --log-level alert

先别着急,你好需要在/etc/syslog.conf文件中加入下面以行配置

Kern.=alert /var/log/netfilter

这表示如果log由Kernel产生,而且log level 为alert级别的日志的话,就存储到/var/log/netfilter文件。

最后重启syslog服务,以后关于FTP协议的log 就会存放到/var/log/netfilter文件。

这里介绍的LOG是由系统syslog处理,另外还有更先进的可以采用ULOG处理方法这里就不详细介绍感兴趣读者参考《UNIX/Linux网络日志分析与流量监控》一书。