红联Linux门户
Linux帮助

权威Linux防火墙著作即将隆重上市

发布时间:2009-03-15 14:19:28来源:红联作者:turingbooks
[i=s] 本帖最后由 turingbooks 于 2009-3-21 09:43 编辑 [/i]

谈到Linux防火墙,可能连资深的Linux粉丝也会邹眉头,因为Linux防火墙的配置和实用都比较复杂,而且防火墙的种类也很多。有很多朋友在日常的工作中会涉及这个领域,但是却苦于找不到系统而完整的资料,稍微好一点儿的、写得深入一点的资料几乎没有。鉴于此,图灵公司特引进了国外知名出版社No Stacrh出版的Linux Firewalls:Attack Detection and Response with iptables,pasd,and fwsnort(中文书名:《Linux防火墙》)。本书原版出版后在国外好评如潮,被业界公认为非常经典的Linux防火墙著作。

本书特色:

本书创造性地将防火墙技术和入侵检测技术相结合来展示开源软件的威力。全书主要介绍了3个开源软件,它们旨在最大限度地发挥iptables检测和防御攻击的效力。首先介绍了psad如何发挥iptables 日志信息的作用并做出积极响应。其次讲解了fwsnort如何将Snort规则转换为iptables规则。最后讲述了fwknop如何实现iptables的单数据包授权。此外,书中大量真实例子以及源代码更有助于读者理解安全防御的原理、技术和实际操作。
本书讲解清晰且实用性很强,适合各层次读者阅读,包括普通Linux 用户、网络安全软件开发人员以及广大计算机安全爱好者等.


对于很多Linuxer而言,肯定对《Linux程序设计(第3版)》(该书的第4版将由图灵公司出版)这本不朽经典耳熟能详,这本书不仅原著的内容非常棒,更值得一提的是,它的翻译质量在如今的翻译类著作中也是罕见的。为了保证翻译质量,图灵公司有幸邀请到了该书的作者陈健老师担任《Linux防火墙》的译者,可谓是译著双馨!

本书目前已经进入三校阶段,预计会在4月与广大读者见面,敬请期待。



文章评论

共有 6 条评论

  1. ljyrxh 于 2009-04-16 11:31:10发表:

  2. turingbooks 于 2009-03-30 18:32:38发表:

    第 2章 (回稿、未经编辑加工) ,未完待续,敬请关注!

    第2章 网络层的攻击与防御 1
    2.1 使用iptables记录网络层首部信息 1
    2.1.1 记录IP首部 2
    2.1.1.1 记录IP选项 3
    2.1.1.2 记录ICMP 4
    2.2 网络层攻击的定义 5
    2.3 滥用网络层 6
    2.3.1 Nmap ICMP Ping 6
    2.3.2 IP欺骗 7
    2.3.3 IP分片 8
    2.3.4 低TTL值 9
    2.3.5 Smurf攻击 10
    2.3.6 DDoS攻击 10
    2.3.7 Linux内核IGMP攻击 11
    2.4 网络层回应 11
    2.4.1 网络层过滤回应 12
    2.4.2 网络层阀值回应 12
    2.4.3 结合多层的回应 13

    第2章 网络层的攻击与防御

    网络层——OSI参考模型中的第三层——是在互联网上分组数据端到端路由和交付的主要机制。本书主要关注的是基于IPv4网络协议的攻击,当然还存在着许多其它网络协议,如IPX、X.25和未来的IPv6协议。

    在本章中,我们将首先关注iptables是如何在输出的日志信息中记录数据包的网络层首部的。然后我们将看到如何利用这些日志来捕获可疑的网络层活动。
    2.1 使用iptables记录网络层首部信息

    通过使用iptables的LOG目标,利用iptables建立的防火墙可以将几乎IPv4首部中的每个字段[1]记录到syslog中。因为iptables的日志记录格式相当的完备,所以iptables日志非常适合用于许多网络层首部滥用的检测。

    2.1.1 记录IP首部

    IP首部由RFC 791定义,它描述了IP首部的结构。图2-1显示了IP的首部,阴影方块代表iptables将在它的日志信息中包括的首部字段。每个阴影方块中包含IP首部字段名,其后跟随着iptables用于在日志信息中标记该字段的标识字符串。例如,总长度字段是由字符串“LEN=”作为前缀,其后跟随数据包中实际的总长度值,而生存时间(TTL)字段的前缀为“TTL=”,其后为TTL值。


    原书p36页 图2-1 IP首部和相应的iptables日志信息字段

    Version 版本
    IHL 首部长度
    Type of Service 服务类型
    Total Length 总长度
    Identification 标识
    Flags 标记
    Fragment Offset 片偏移
    Time-to-Live 生存时间
    Protocol 协议
    Header Checksum 首部校验和
    Source Address 源IP地址
    Destination Address 目的IP地址
    Options(OPT=, not decoded,requires --log-ip-options)
    选项(OPT=,未解码,需要 --log-ip-options)
    Padding 填充

    图2-1中深灰色方块所表示的字段总是被iptables记录[2]。白色方块所表示的首部字段在任何情况下都不会被iptables记录。中灰色方块表示的是IP首部中的选项部分,它之所以用这个颜色是因为只有当一个LOG规则使用了“--log-ip-options”命令行参数时,iptables才会记录IP选项。

    下面是一个iptables日志信息的示例,它是当从ext_scanner系统发送一个ICMP回显请求给iptablesfw系统时生成的(请参考图1-2):

    [ext_scanner]$ ping -c 1 71.157.X.X
    PING 71.157.X.X (71.157.X.X) 56(84) bytes of data.
    64 bytes from 71.157.X.X: icmp_seq=1 ttl=64 time=0.171 ms

    --- 71.157.X.X ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 0.171/0.171/0.171/0.000 ms
    [iptablesfw]# tail /var/log/messages | grep ICMP | tail -n 1
    Jul 22 15:01:25 iptablesfw kernel: IN=eth0 OUT=
    MAC=00:13:d3:38:b6:e4:00:30:48:80:4e:37:08:00 SRC=144.202.X.X DST=71.157.X.X
    LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=44366 SEQ=1

    上面日志信息中的IP首部以源IP地址(被扩展为标准的点分十进制表示法)开始[3]。其它的IP首部字段如目的IP地址、TTL值和协议字段都以粗体字显示。服务类型字段(TOS)被分为优先级子字段和服务类型子字段并以单独的十六进制值形式分别记录到TOS和PREC字段中。首部的Flags字段在本例中被记录为字符串DF(Don’t Fragment,不分片)以表明不允许IP网关将数据包分成多个小块。最后,PROTO字段表示的是在IP首部中封装的协议——在本例中是ICMP协议。在上面日志信息中包括的其余字段有ICMP TYPE、CODE、ID和SEQ,它们都是由ping命令发送的ICMP回显请求数据包中的字段,而不属于IP首部。

    2.1.1.1 记录IP选项

    IP选项提供了针对IP通信的各种控制功能,包括时间戳、某些安全功能和一些特定路由特性的规定。IP选项的长度可变,而且在互联网上的使用并不多。如果一个IP数据包不包含IP选项,那么它的首部长度总是正好20个字节。iptables需要使用如下命令(注意用粗体字表示的“--log-ip-options”参数)来记录IP首部中的选项部分:

    [iptablesfw]# iptables -A INPUT -j LOG --log-ip-options

    由第1章的iptables.sh脚本所构建策略中的缺省LOG规则都使用了“--log-ip-options”命令行参数,这是因为IP选项中所包含的信息会提供一些安全提示。

    现在,为了阐明包含IP选项的iptables日志信息,我们再次对iptablesfw系统使用ping命令,但这次我们对ping命令设置了时间戳选项tsonly(即only timestamp,只使用时间戳):

    [ext_scanner]$ ping -c 1 -T tsonly 71.157.X.X
    PING 71.157.X.X (71.157.X.X) 56(124) bytes of data.
    64 bytes from 71.157.X.X icmp_seq=1 ttl=64 time=0.211 ms
    TS: 68579524 absolute
    578
    0
    -578
    --- 71.157.X.X ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 0.211/0.211/0.211/0.000 ms
    [iptablesfw]# tail /var/log/messages | grep ICMP
    Jul 22 15:03:00 iptablesfw kernel: IN=eth0 OUT=
    MAC=00:13:d3:38:b6:e4:00:30:48:80:4e:37:08:00 SRC=144.202.X.X DST=71.157.X.X
    LEN=124 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF OPT (44280D00041670C404167306000000
    00000000000000000000000000000000000000000000000000) PROTO=ICMP TYPE=8 CODE=0
    ID=57678 SEQ=1

    在上面的粗体字显示内容中,字符串OPT后跟一长串十六进制字节序列。这些字节是包含在IP首部中的完整IP选项,但iptables LOG目标并没有为我们解码它,我们将在第7章中看到如何使用psad来了解它的含义。

    2.1.1.2 记录ICMP

    iptables的LOG目标中有专门的代码用于记录ICMP,既然ICMP出现在网络层[4],我们就在这里对它进行介绍。ICMP(由RFC 792定义)有一个很简单的32位长的首部。图2-2显示了ICMP的首部。这个首部包括三个字段:类型(8位)、代码(8位)和一个校验和(16位),其余字段属于ICMP报文的数据部分。

    数据部分中的具体字段取决于ICMP的类型值和代码值。例如,与一个ICMP回显请求(类型 8,代码 0)相关联的字段包括一个标识符和一个序号值。


    原书p38页 图2-2 ICMP首部和相应的iptables日志信息字段

    Type(TYPE=) 类型(TYPE=)
    Code(CODE=) 代码(CODE=)
    Checksum 校验和
    DATA:::(depends on Type and Code and is variable length--logged to some extent)
    数据:::(取决于类型值和字段值,它是可变长的——LOG目标将根据具体情况进行记录)

    和IP首部一样,LOG目标总是记录ICMP的类型和代码字段,但不会记录ICMP的校验和字段。iptables中没有命令行参数会影响到LOG目标如何记录ICMP数据包的数据部分中的字段[5]。本章中第一个回显请求数据包中的ICMP字段出现在下面的最后一行:

    Jul 22 15:01:25 iptablesfw kernel: IN=eth0 OUT=
    MAC=00:13:d3:38:b6:e4:00:30:48:80:4e:37:08:00 SRC=144.202.X.X DST=71.157.X.X
    LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP
    TYPE=8 CODE=0 ID=44366 SEQ=1

    2.2 网络层攻击的定义

    我们将网络层攻击定义为:通过发送滥用网络层首部字段的一个或一系列数据包以利用端主机的网络栈实现中的漏洞、消耗网络层资源或隐藏针对更高层协议的攻击。

    网络层攻击的类型可以分为如下三种:

    首部滥用:包含恶意构造的、损坏的或非法改装的网络层首部的数据包。如带有伪造源地址或包含虚假片偏移值的IP数据包。

    利用网络栈漏洞:在数据包中包含经过特别设计的组件以利用端主机的网络栈实现中的漏洞。也就是说,专门负责处理网络层信息的代码本身成为攻击的目标。一个很好的例子是在Linux内核(版本2.6.9和之前的版本)中发现的互联网组管理协议(IGMP)拒绝服务(DoS)漏洞。[6]

    带宽饱和:经过特别设计以消耗目标网络中所有可用带宽的数据包。通过ICMP发送的分布式拒绝服务(DDoS)攻击就是一个很好的例子。

    注意 虽然本章重点讨论的是滥用网络层的技术,但值得注意的是许多这些技术都可以和其它层的攻击技术结合在一起使用。例如,一个应用层攻击(比如一个利用缓冲区溢出漏洞的攻击)可以通过分片IP数据包发送以努力避免被入侵检测系统发现。在这种情况下,通过使用网络层的分片技术来发送实际利用应用层漏洞的攻击数据包将使得应用层攻击的检测变得更加困难。

    2.3 滥用网络层

    网络层提供了将数据包路由到世界各地的能力,它同时也提供了攻击世界各地目标的能力。因为IPv4没有任何验证的概念(这项工作留给了IPSec协议或位于更高层的机制),所以攻击者可以很容易的使用操纵的首部或数据来手工构造IP数据包并将它们放入网络。虽然这种数据包可能会在到达它们的预定目标之前被在线的过滤设备如防火墙或带有访问控制列表(ACL)的路由器过滤掉,但它们常常也能躲过这些过滤而到达目的地。

    2.3.1 Nmap ICMP Ping

    当Nmap被用于扫描不在同一子网中的系统时,它将通过发送一个ICMP回显请求数据包和一个目标端口为80的TCP ACK数据包到目标主机来完成主机发现(主机发现可以使用Nmap的“-P0”命令行参数来禁用,但它缺省是启用的)。由Nmap生成的ICMP回显请求数据包与ping程序生成的数据包不同,Nmap回显请求在ICMP首部之后不包括任何数据。因此,如果这样的数据包被iptables记录,它的IP总长度字段应为28(不带选项的20字节长的IP首部,加上8字节长的ICMP首部,再加上0字节长的数据,如下面的粗体字显示):

    [ext_scanner]# nmap -sP 71.157.X.X
    [iptablesfw]# tail /var/log/messages | grep ICMP
    Jul 24 22:29:59 iptablesfw kernel: IN=eth0 OUT=
    MAC=00:13:d3:38:b6:e4:00:30:48:80:4e:37:08:00 SRC=144.202.X.X DST=71.157.X.X
    LEN=28 TOS=0x00 PREC=0x00 TTL=48 ID=1739 PROTO=ICMP TYPE=8 CODE=0 ID=15854
    SEQ=62292

    注意 ping程序通过使用“-s 0”命令行参数将有效载荷的长度设置为0的方法也可以生成不带应用层数据的报文,但在缺省情况下,ping程序将包括几十字节的有效载荷数据。

    虽然在一个ICMP数据包中不包括应用层数据本身并不能表明这是一种对网络层的滥用,但如果你看到这类数据包和表明端口扫描或端口扫射这类活动(见第3章)的数据包相结合,这就表明有人正在使用Nmap对你的网络进行侦察。

    2.3.2 IP欺骗

    在计算机安全领域,没有比欺骗特别是IP欺骗带来更多混乱和夸张效果的技术了。欺骗是一种愚弄或一个恶作剧,而IP欺骗指的是故意构造一个带有伪造源地址的IP数据包。

    注意 IP数据包的网络地址转换(NAT)操作(如常见的由防火墙提供的将整个内部网络置于单个外网IP地址保护之下)是一个例外。NAT与IP欺骗不同,前者是一个合法的网络功能,而使用伪造的源地址隐藏攻击则不是。

    当通过IP协议进行通信时,IP协议对一个数据包中的源地址并没有内置的限制。通过使用一个原始套接字(一个底层编程API,它按照某种标准构造数据包),我们可以发送一个带有任意源地址的IP数据包。如果源地址对于本地网络是无意义的(例如,如果源IP地址属于Verizon网络,但该数据包却来自Comcast网络),那么我们就说该数据包是伪造的。管理员可以通过配置路由器和防火墙来禁止转发源地址不在内部网络范围内的数据包(使得伪造的数据包不能出去),但许多网络都缺乏这样的控制。我们在第1章中介绍的缺省iptables策略内置了反欺骗规则。

    从安全的角度来看,对于伪造数据包(以及通常意义上的IP数据包),我们所需要知道的最重要的事情是完全无法信任它的源地址。事实上,有时候一个完整的攻击甚至可以通过单个伪造数据包来完成(请见第8章中关于Witty蠕虫的讨论)。

    注意 任何带有一个伪造源地址的数据包纯粹都属于“fire and forget”(发射后不理),这是因为从目标地址返回的针对该数据包的任何响应都直接发送给了伪造的地址。尽管值得安慰的是任何需要双向通信的协议(如传输层的TCP)将不能通过伪造IP地址正常工作。[7]

    许多安全软件(攻击的和防御的)都包括伪造源IP地址的能力。分布式拒绝服务(DDoS)工具通常都会将实现IP欺骗作为其必备条件,一些著名的工具如hping和Nmap也可以伪造源地址。


    使用PERL语言实现IP欺骗

    我们可以很轻松的使用如hping这样的工具或你自己的欺骗工具构造一个带有伪造源地址的数据包。下面是一个简单的Perl代码段,它构造了一个带有伪造源地址的UDP数据包,该数据包中还包括你所选择的应用层数据(这个例子中的“滥用”部分就是伪造的源地址)。脚本使用了Net::RawIP Perl模块,源IP地址从命令行读取,见①,然后它在②处被设置进IP的首部:

    #!/usr/bin/perl -w

    use Net::RawIP;
    use strict;
    my $src = ①$ARGV[0] or &usage();
    my $dst = $ARGV[1] or &usage();
    my $str = $ARGV[2] or &usage();

    my $rawpkt = new Net::RawIP({
    ip => {
    ②saddr => $src,
    daddr => $dst
    },
    udp =>{}}
    );
    $rawpkt->set({ ip => {
    saddr => $src,
    daddr => $dst },
    udp => {
    source => 10001,
    dest => 53,
    data => $str,
    }
    });
    $rawpkt->send();
    print '[+] Sent ' . length($str) . " bytes of data...\n";
    exit 0;
    sub usage() {
    die "usage: $0 ";
    }

    2.3.3 IP分片

    将IP数据包分解为一系列较小的数据包是IP协议的一个基本功能。每当一个IP数据包被路由到一个数据链路层MTU的大小不足以容纳整个数据包的网络时,被称为分片的IP数据包分解过程就必须被执行。任何连接两个具备不同MTU大小的数据链路层的路由器都有责任确保在这两个数据链路层之间传输的IP数据包大小绝不会超过对方MTU的值。目标主机的IP协议栈将重组IP分片以还原最初的数据包,然后在该数据包中封装的协议将交给上一层的协议栈。

    一个攻击者可以利用IP分片技术(通过构建攻击数据包并故意将该数据包分解为多个IP分片)来逃避IDS的检查。任何完整实现的IP协议栈都能够重组被分片的报文,为了检测攻击,一个IDS也不得不使用与目标主机的IP协议栈相同的算法来重组数据包。但因为不同的IP协议栈所实现的重组算法略有不同(例如,对于重叠的分片,Cisco IOS的IP协议栈根据最新分片策略进行重组,而Windows XP的协议栈则根据最早分片策略进行重组),这就给IDS带来了挑战[8]。生成分片数据包的金标准是Dug Song的fragroute工具(见http://www.monkey.org)。

    2.3.4 低TTL值

    每个IP路由器都会将经过它转发的IP数据包的IP首部中的TTL值减1[9]。如果在你的本地子网中出现的数据包有一个为1的TTL值,那么这很可能表明有人正在对一个IP地址使用traceroute程序(或它的一个变体程序,如tcptraceroute),这个IP地址可能存在于本地子网中,也可能是在一个可以通过本地子网路由到的子网中。通常情况下,这只是表示有人正在排除一个网络连接故障,但它也可能表示有人正在对你的网络执行侦察工作以找出到一个潜在目标的跳数。

    注意 目标地址为组播地址的数据包(在224.0.0.0到239.255.255.255范围内的所有地址,由RFC 1112定义)通常将TTL设置为1。因此如果目标地址是一个组播地址,这类通信可能和traceroute的网络映射努力没有关系,而是合法的组播通信。

    由traceroute产生的UDP数据包被iptables记录如下(注意由粗体字显示的TTL部分):

    Jul 24 01:10:55 iptablesfw kernel: DROP IN=eth0 OUT=
    MAC=00:13:d3:38:b6:e4:00:13:46:c2:60:44:08:00 SRC=144.202.X.X DST=71.157.X.X
    LEN=40 TOS=0x00 PREC=0x00 TTL=1 ID=44081 PROTO=UDP SPT=54522 DPT=33438 LEN=20


    使用分片和有针对性的TTL值隐藏攻击

    路由路径信息与分片重组技巧相结合对隐藏网络攻击很有用处。例如,假设一个攻击者发现在目标主机前存在一个路由器(由traceroute确定),并且攻击者还怀疑有一个IDS正处于目标主机的子网之前并在监视着目标主机所在的子网。如果情况确实如此,那么目标主机可以被由三个IP分片(f1,f2和f3)所组成的数据包攻击,而且这里采用的攻击方式还不会被IDS检测到。攻击者首先对第二个分片(f2)创建一个重叠分片,将该分片的有效载荷替换为无效数据,然后将它的TTL值修改为正好让该分片到达路由器时分片的TTL值为1。我们将这个重叠分片称为f2’。接下来,攻击者发送第一个分片(f1),其次是这个新的分片(f2’),然后是f3,最后是原来的f2分片。IDS(位于路由器之前)看到了所有4个分片,但第3个分片的到达就已可以重组整个数据包了,因此IDS将三个分片重组为f1+f2’+f3。
    因为f2’包含的是无效数据,所以这三个分片重组在一起构成的数据包对IDS来说并不像是一个攻击。于是,f2’到达路由器,但在它被路由器转发之前它的TTL值被减为0,因此它被路由器丢弃,目标IP地址不会看到分片f2’。但该主机会看到分片f1和f3,由于在没有接收到f2之前,它无法将f1和f3重组为一个有意义的数据包,所以它将等待f2的到达。
    当f2最终到达(攻击者最后发送了它),目标主机在重组了所有三个分片后将遭受真正的攻击。这个技术由Vern Paxson最先在“Bro: A System for Detecting Network Intruders in Real-Time”(Bro:实时检测网络入侵者的系统)中提出(见http://www.icir.org/vern/papers/bro-CN99.html),它提供了一种很聪明的方式以利用网络层来逃避IDS的检查。

    注意 在本地子网中另一个可疑的TTL值是零。只有当一个有着严重漏洞的路由器将这样的数据包转发进子网或该数据包来自位于同一子网中的系统时,它才会存在。

    2.3.5 Smurf攻击

    Smurf攻击是一个古老的、但又十分优雅的攻击技术,即攻击者伪造源地址发送ICMP回显请求到一个网络广播地址。这个伪造的地址就是预定的攻击目标,攻击的目的是试图使用尽可能多的对发往广播地址的回显请求的响应来淹没目标主机。如果网络没有针对这种发往广播地址的ICMP回显请求进行控制(如在Cisco路由器中使用“no ip directed-broadcast”命令),那么所有接收到该回显请求的主机都将返回响应给伪造的源地址。通过使用针对一个大型网络的广播地址,攻击者可以放大攻击目标主机的数据包数。

    与使用专用控制信道并且还没有简单的路由器配置对策的DDoS攻击(下一节讨论)相比,Smurf攻击已经过时。但它仍值得一提,这是因为Smurf攻击易于执行,并且其最初的源代码很容易获得(见http://www.phreak.org/archives/exploits/denial/smurf.c)。
    2.3.6 DDoS攻击

    位于网络层的DDoS攻击利用许多系统(可能数以千计)向目标IP地址同时发送攻击数据包。这种攻击的目的是使用垃圾数据尽可能的消耗光目标网络的带宽以阻止合法的通信。DDoS攻击是最难应付的网络层攻击之一,因为现在有太多的系统是通过宽带连接到互联网。当一个攻击者成功的侵入一些具备高速互联网连接的系统时,他就有可能对互联网上的大多数站点发动毁灭性的DDoS攻击。

    由于DDoS代理端创建的数据包可以被伪造,所以在数据包到达受害者时通过指定源IP地址的方式来过滤攻击通常是徒劳的。

    例如,根据Snort的签名规则集(在后面的章节中讨论),Stacheldraht DDoS代理(见http://staff.washington.edu/dittrich)将ICMP数据包的源地址伪造为3.3.3.3。所以如果你看到一个数据包的源IP地址为3.3.3.3,并且目标IP地址为一个外网的地址,那么你就知道在你的本地网络中有一个系统已成为Stacheldraht僵尸。由Stacheldraht发送的数据包在被iptables记录时,其形式如下所示(源IP地址为3.3.3.3,见①;ICMP类型为0,见②;ICMP标识符为666,见③,来自Snort规则ID224):

    Jul 24 01:44:04 iptablesfw kernel: SPOOFED PKT IN=eth0 OUT=
    MAC=00:13:d3:38:b6:e4:00:13:46:c2:60:44:08:00 ①SRC=3.3.3.3 DST=71.157.X.X
    LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=ICMP
    ②TYPE=0 CODE=0 ③ID=666 SEQ=1

    一般而言,尝试检测与DDoS代理相关联的控制通信比检测洪泛数据包本身要更有效。例如,检测通过隐匿的端口从主控端发往僵尸节点的命令就是一个好的策略(Snort规则集中的一些签名就是用来查找这类通信——见Snort签名集中的dos.rules文件)。这同时也有助于从一个网络中移除DDoS代理,因为通过控制通信可以发现受感染的系统。
    2.3.7 Linux内核IGMP攻击

    利用Linux内核中互联网组管理协议(IGMP)处理代码中的某一特定漏洞进行的攻击是专门针对负责处理网络层通信代码所实施的攻击的一个很好的例子。这个漏洞存在于Linux内核从2.4.22-2.4.28和2.6-2.6.9的版本中,它既可以被远程利用也可以被本地用户利用(某些安全漏洞只能被本地利用,所以这是一个令人生厌的漏洞)。通过网络从远程系统实施的一次成功的攻击将导致内核崩溃,更详细的讨论见http://isec.pl/vulnerabilities/isec-0018-igmp.txt。内核代码有时会包含安全漏洞,这些漏洞可以存在于任一层次,甚至存在于低层的网络层处理代码中或位于设备驱动程序中。

    2.4 网络层回应

    规范网络层回应的定义与规范网络层攻击的定义一样有用。这是因为这类回应不应涉及位于传输层或更高层的信息,我们只限于以下列三种方式之一来操纵网络层首部:

     通过防火墙或路由器这样的设备建立的过滤操作来阻止攻击者的源IP地址。
     重新配置路由协议以“route blackholing”(黑洞路由)的方式拒绝攻击者将数据包路由到预定的攻击目标——数据包被发送到黑洞,就好像从来没有到过一样。
     为流量规定阀值逻辑以基于使用的带宽允许数据包通过防火墙或路由器。

    一个纯粹来自网络层的回应可以被用于对付在应用层检测到的攻击,但这类回应不应涉及到如生成一个TCP RST数据包这样的事情——这属于一个传输层回应,我们将在第3章中介绍它。

    2.4.1 网络层过滤回应

    当一个攻击被检测到来自某一特定的IP地址时,你可以使用如下的iptables规则作为网络层的回应,这些规则属于iptables的过滤类,它们被添加到INPUT、OUTPUT和FORWARD链中,它们将屏蔽来自或发往IP地址144.202.X.X的所有数据包(不管这个数据包使用的是什么协议、什么端口):

    [iptablesfw]# iptables -I INPUT 1 -s 144.202.X.X -j DROP
    [iptablesfw]# iptables -I OUTPUT 1 -d 144.202.X.X -j DROP
    [iptablesfw]# iptables -I FORWARD 1 -s 144.202.X.X -j DROP
    [iptablesfw]# iptables -I FORWARD 1 -d 144.202.X.X -j DROP

    在FORWARD链中有两个规则,它们分别用于屏蔽来自144.202.X.X的数据包(-s 144.202.X.X)和来自内网系统并且目标为144.202.X.X的响应(-d 144.202.X.X)。如果你使用iptables作为你的网络哨兵,那么上述规则将针对144.202.X.X地址提供一个有效的网络屏蔽点。

    2.4.2 网络层阀值回应

    为iptables目标应用阀值逻辑是通过iptables的limit扩展功能完成的。例如,我们可以在一个ACCEPT规则中使用limit扩展来限制在给定时间中允许从某个特定源地址接收的数据包数目。下面的iptables规则只允许每秒接受10个来自或发往144.202.X.X IP地址的数据包。

    [iptablesfw]# iptables -I INPUT 1 -m limit --limit 10/sec -s 144.202.X.X -j ACCEPT
    [iptablesfw]# iptables -I INPUT 2 -s 144.202.X.X -j DROP
    [iptablesfw]# iptables -I OUTPUT 1 -m limit --limit 10/sec -d 144.202.X.X -j ACCEPT
    [iptablesfw]# iptables -I OUTPUT 2 -d 144.202.X.X -j DROP
    [iptablesfw]# iptables -I FORWARD 1 -m limit --limit 10/sec -s 144.202.X.X -j ACCEPT
    [iptablesfw]# iptables -I FORWARD 2 -s 144.202.X.X -j DROP
    [iptablesfw]# iptables -I FORWARD 1 -m limit --limit 10/sec -d 144.202.X.X -j ACCEPT
    [iptablesfw]# iptables -I FORWARD 2 -d 144.202.X.X -j DROP

    每一个使用了limit匹配的ACCEPT规则都有一个对应的DROP规则。这主要是针对那些到达的速率超过了limit匹配所允许的最大每秒10个的数据包,一旦数据包到达的速率超过了这个阀值,它们将不再匹配ACCEPT规则而将和iptables策略中其余的规则进行比较。通常更好的做法是直接拒绝和一个攻击者之间的通信而不是允许速率在某个阀值之下的数据包通过。

    你还可以使用limit匹配来限制由缺省的日志记录规则记录的iptables日志信息数目。但除非你特别关注磁盘空间的使用,否则对LOG规则应用一个limit阀值通常是不需要的,因为内核在LOG目标内部使用了一个环缓冲区,所以每当数据包匹配LOG规则的速度要快于它们通过syslog记录的速度时,日志信息就将被覆盖。

    2.4.3 结合多层的回应

    正如攻击所作的那样,回应也可以结合多层。例如,我们可以结合如fwsnort和psad这样的工具(见第11章),在发送一个TCP RST报文的同时立即启用一个防火墙规则来阻止攻击者。

    一种挫败恶意TCP连接的方法是使用iptables的REJECT目标,然后立即针对攻击的源地址启用一个持久的拦截规则。这个持久的拦截规则属于网络层回应,它将屏蔽任何来自攻击者当前IP地址到最初攻击目标的进一步通信。

    虽然这听起来好像很有效,但请注意一个攻击者可以通过洋葱路由器(Tor)网络[10]将攻击数据包路由到目标主机以绕开防火墙中的拦截规则。通过Tor发送攻击将使得目标主机无法预测攻击的源地址。

    对伪造源IP地址的攻击来说也同样如此。欺骗攻击并不需要双向通信,所以回应这样的数据包很危险。如果这样做,实际上是将谁将被防火墙拦截的控制权交给了攻击者!因为我们不太可能将所有重要的IP地址(如DNS服务器、上游路由器、远程VPN隧道终端等)都放入防火墙策略的白名单中,所以将控制权交给攻击者是很危险的。本章前面的一些可疑通信示例如伪造的UDP字符串、带有低TTL值的数据包和Nmap ICMP回显请求都是不适宜于做出积极回应的很好范例。

    正如我们将在后面章节中看到的那样,只有少数几种通信类型适宜于自动回应。

  3. rxy_pink 于 2009-03-25 14:10:06发表:

    买买看呀,买买看!

  4. rxy_pink 于 2009-03-25 14:09:52发表:

    有买的没?

  5. 大宝 于 2009-03-15 16:46:31发表:

    好,谢谢,正式版出来后,天天到新华书店去看

  6. Totoobo 于 2009-03-15 15:27:18发表:

    纯支持下