《Linux防火墙(第4版)》——2.4 过滤传入的数据包

    xiaoxiao2023-12-23  26

    本节书摘来自异步社区《Linux防火墙(第4版)》一书中的第2章,第2.4节,作者:【美】Steve Suehring(史蒂夫 苏哈林)著,更多章节内容可以访问云栖社区“异步社区”公众号查看

    2.4 过滤传入的数据包

    外部网卡I/O对中的输入端、输入规则集,对于保护您的站点而言,是更值得注意的。就像前面提到的那样,您能够基于源地址、目的地址、源端口、目的端口、TCP状态标志以及其他标准进行过滤。

    您将在后面的章节中了解到所有这些信息。

    2.4.1 远程源地址过滤在数据包层面,唯一确定IP数据包发送者的方式便是数据包报头的源地址。这个事实为源地址欺骗(source address spoofing)提供了可能,发送者将一个并非他/她真实地址的错误地址放在报文的相应源地址域里。该地址可能是一个不存在的地址,也可能是属于另一个人的合法的地址。这会使得令人讨厌的访问闯入您的系统,它们看起来是本地的、可信赖的流量;在攻击其他站点时假扮成您;假装另外的别人来攻击您;让您的系统陷入向不存在的地址响应的困境;或以传入消息的来源误导您。

    重要的是要记住,您通常无法检测出伪造的地址。这个地址可能是合法的并且是可路由的,但它并不属于该数据包的发送者。下面的章节将描述您可以检测出的伪造的地址。

    1.源地址欺骗和非法地址有几个种类的源地址,不论任何情况下,您都应该在您的外部接口中拒绝它们。它们是声称来自下面地址传入的数据包。

    您的IP地址:您永远也不会看到合法的传入数据包声称它们来自于您的计算机。由于源地址是唯一的可用信息,并且它可以被修改,这是一种您可以在数据包过滤级别检测的合法地址欺骗。声称来自于您的计算机的数据包是伪造的数据包。您不能确定其他传入数据包是否从他们所声明的地方被传输过来。(有些操作系统会在收到一个源地址和目的地址都属于主机的网络接口地址时崩溃)您的局域网地址:您很少会看到合法的流入数据包声称来自于您的局域网,但却在外部的互联网接口上被接收。如果局域网有多个到互联网的访问点,那么看到这些数据包是可能的,但这通常可能是局域网配置错误的信号。在大多数情况下,这样的数据包是想利用您本地局域网的信任关系,尝试进入您的站点。A、B、C类地址中的私有IP地址:在历史上的A、B、C类地址中,这三种类型的地址是为私有局域网而保留的。它们不适宜在互联网上使用。就其本身而论,这些地址能够被任何站点内部地使用,而无需购买注册的IP地址。您的计算机应该永远不会看到从这些源地址流入的数据包。A类私有地址被分配的范围是10.0.0.0~10.255.255.255。B类私有地址被分配的范围是172.16.0.0~172.31.255.255C类私有地址被分配的范围是192.168.0.0~192.168.255.255D类组播IP地址:在D类地址范围内的IP地址被预留作为参加到组播网络广播的目的地址,例如音频广播或视频广播。它们的范围是224.0.0.0到239.255.255.255。您的计算机应该永远不会看到从这些源地址发来的数据包。E类的保留IP地址:E类范围内的IP地址被保留以用于未来或实验性使用,它们并没有被公开地分配。它们的范围从240.0.0.0到247.255.255.255。您的计算机应该永远不会看到来自这些源地址的数据包,基本上永不会。(由于整个直到255.255.255.255的地址范围被永远地保留,E类地址实际上可以定义为240.0.0.0到255.255.255.255。事实上,某些定义E类地址的范围正是上面这样。)回环接口地址:回环接口是一个私有网络接口,Linux系统将其用于本地的、基于网络的服务。操作系统在回环接口上为了性能的提升而走了捷径,它并未通过网络接口驱动发送本地流量。按照定义,回环流量的目标是产生它的系统。它不会走出到网络中。回环地址的范围是127.0.0.0到127.255.255.255。您通常看到它被称为127.0.0.1、localhost或回环接口:lo。畸形的广播地址:广播地址是一类面向网络中所有主机的特殊的IP地址。地址0.0.0.0是一个特殊的广播源地址。一个合法的广播源地址可以是0.0.0.0或一个普通的广播IP地址。DHCP客户端和服务器会看到从0.0.0.0到来的流入广播数据包。这是该源地址唯一合法的使用。它不是一个合法的点到点的单播源地址。当看到源地址是一个普通的、点到点的非广播地址时,要么说明发送方没有被完全配置,要么该地址是伪造的。A类网络的0地址:像前面建议所说的那样,任何从0.0.0.0~0.255.255.255的源地址都是非法的单播地址。链路本地网络地址(Link local network addresses):DHCP客户端有时候在无法从服务器获得地址时,会为它们自身分配一个链路本地地址。这些地址的范围是169.254.0.0到169.254.255.255。运营商级NAT(Carrier-grade NAT):这些IP地址被标记为由互联网提供商使用,并且应该永远不会出现在公共网络互联网里。然而,这些地址可以在云环境中使用,因此,如果您的服务器被托管在一个云提供商那里,您可能会看到这些地址。运营商级NAT地址范围从100.64.0.0~100.127.255.255。测试网络地址:从192.0.2.0~192.0.2.255之间的地址空间被预留以测试网络。2.阻止问题站点另一个普遍但不常用的源地址过滤策略是,阻止筛选出的一些计算机,或更典型地,阻止某个网络里所有的IP地址。互联网社区倾向于对问题站点和不监管其用户的ISP采取这种措施。如果一个站点有了“坏互联网邻居”的声誉,那么其他站点就可能全面地阻止该站点。

    在个人方面,当特定的远端网络里的人们习惯性地做一些令人讨厌的事,那么阻止该网络的所有访问则是方便快捷的。这种方法早已被用来对抗不请自来的邮件,有些人甚至会阻止某一个国家整个范围的IP地址。

    3.限制选中的远程主机的传入数据包您也许仅想从特定的外部站点或个人处接收某些类型的传入数据包。在这种情况下,防火墙规则将定义它接受的特定的IP地址或有限范围的IP源地址,防火墙只接受由这些地址发送的数据包。

    第一类传入数据包是来自于响应您请求的远程服务器。尽管有一些服务,例如Web或FTP服务(的响应),可以预期来自任何地方,但其他服务(合理的情况下)只会合法地来自于您的ISP或特别选择的受信任的主机。那些可能仅仅通过您的ISP提供的服务包括POP邮件服务、域名服务(DNS)名称服务器响应、可能的DHCP或动态IP地址分配。

    第二类传入数据包是来自于远程客户端,它们要访问您站点提供的服务。再次的,尽管一些到来的连接(例如连接到您的Web服务器)可以预期来自于任何地方,但其他的本地服务将只对一部分受信任的远程用户或朋友们开放。这些受限的本地服务的例子可以是ssh和ping。

    2.4.2 本地目的地址过滤基于传入数据包的目的地址过滤数据包并不是太大的问题。在正常条件下,您的网络接口卡会忽略那些不发往自己的数据包。但广播数据包则是一个例外,它会广播到网络中的所有主机。

    IPv4地址255.255.255.255是一个普通的广播目的地址。它被称为受限广播(limited broadcast),指的是直接物理网段里的所有主机。广播地址可以被更明确地定义为某个给定的子网中的最大的网络地址。例如,如果您的ISP网络地址是192.168.10.0,而您的IP地址是192.168.10.30,由于使用了24比特的子网掩码(255.255.255.0),您将会看到从您的ISP处发出的发往192.168.10.255的广播数据包。另一方面,如果您有一个更小范围的IP地址,例如/30(255.255.255.252),那么您一共拥有四个地址:一个表示网络,两个可用于主机,另一个则是广播地址。例如,考虑网络10.3.7.4/30。在这个网络里,10.3.7.4是网络地址,而两个主机地址则是10.3.7.5和10.3.7.6,广播地址则是10.3.7.7。这个/30的子网配置类型通常在路由器间使用,尽管它们各自使用的实际地址可能不同。唯一得到一个特定子网的广播地址的方式即是同时获得一个该子网中的IP地址和该子网的子网掩码。这种类型的广播被称为直接子网广播(directed subnet broadcasts),它们被传递给那个网络中的所有主机。

    广播到目的地址0.0.0.0的情况类似于“源地址欺骗和非法地址”小节中,提到的声称来自于之前提到的(0.0.0.0)这个广播源地址的点到点的数据包。这里,广播数据包指向源地址0.0.0.0而不是目的地址255.255.255.255。这种情况下,该数据包的意图毫无疑问。它在尝试识别您的系统是否是一台运行Linux的计算机。由于历史原因,从BSD UNIX衍生的系统在回应以0.0.0.0作为广播目的地址的数据包时,会返回类型为3的ICMP错误消息。其他系统会静默地丢弃这个数据包。同样地,这是一个很好的例子,关于为什么丢弃数据包和驳回数据包会有所不同。在这种情况下,错误消息本身就是探测活动要找的东西。

    2.4.3 远程源端口过滤从远程客户端到达您本地服务器的请求和连接将使用一个处于非特权范围的源端口号。如果您正托管着一个Web服务器,所有到来的连接的源端口号应该在1024到65535之间。(而服务端口号则标识了请求某服务的意图,并不保证成功。您不能确定您期望访问的服务运行在您期望的端口上。)

    从您联系的远程服务器处到来的响应和连接将使用分配给该服务的源端口。如果您连接到一个远程站点,那么所有从该远程站点到来的消息的源端口都是80(或任何本地客户端指定的端口号),即HTTP服务端口号。

    2.4.4 本地目的端口过滤传入数据包的目的端口标识了该数据包意图访问的您计算机上的程序或服务。正如源端口一样,所有从远程客户端传入到您的服务的请求通常会遵循同样的模式,而所有从远端服务传入到您的本地客户端的响应则会遵循另一个不同的模式。

    从远程客户端传入到您本地服务器的请求和连接会将目的端口设置为您为特定的服务所分配的端口号。例如,有一个传入数据包的目标是您的本地Web服务器,则它通常会设置目的端口为80,即HTTP服务端口号。

    从您联系的远端服务器到来的响应将会把目标端口设置为非特权范围内的端口号。如果您连接到一个远程站点,所有从远端服务器到来的消息的目的端口的范围将在1024~65535之间。

    2.4.5 传入TCP的连接状态过滤传入TCP数据包的接受规则可以使用与TCP连接相关的状态标志。所有的TCP连接都会遵循同样的连接状态集。由于连接建立过程中的三次握手过程,客户端和服务端上的状态会有不同。同样地,防火墙能够将从远程客户端到来的流量与从远端服务器到来的流量区分开来。

    从远程客户端传入的TCP数据包会在接收到的第一个数据包中设置SYN标志,以作为三次握手的一部分。第一次连接请求会设置SYN标志,但不会设置ACK标志。

    从远端服务器传入的数据包总是会回应从您本地客户端程序发起的最初的连接请求。每个从远端服务器接收的TCP数据包都已被设置ACK标志。您的本地客户端防火墙规则将要求所有从远端服务器传入的数据包设置ACK标志。服务器通常不会尝试向客户端发起连接。

    2.4.6 探测和扫描探测(probe)通常指尝试连接或尝试从一个单独的服务端口获得响应。扫描(scan)是对一组不同的服务端口进行的一系列探测。扫描通常是自动的。

    不幸的是,探测和扫描极少是无辜的。它们更像是最初的信息收集步骤,在发起攻击前寻找感兴趣的漏洞。自动的扫描工具是非常普遍的,而且通常由一组黑客互相协同努力完成。互联网上的很多主机安全或缺乏安全,随着蠕虫、病毒和僵尸机器的扩散,扫描变成了互联网上一个永恒的问题。

    常规端口扫描常规端口扫描是对一大块,也许是整块范围(见图2.6)内服务端口的无差别的探测。由于存在更复杂的、有针对性的隐形工具,这些扫描通常不太频繁或至少不太明显。

    定向端口扫描目标端口寻找特定的漏洞(见图2.7)。更新的、更复杂的工具会尝试识别硬件、操作系统和软件版本。这些工具被设计用来确认目标是否可能存在一个特定的漏洞。

    常用服务端口目标常用的目标通常会被独立地探测以及扫描。攻击者可能在寻找一个特定的漏洞,例如一个不安全的邮件服务器、一个未打补丁的Web服务器或一个开放的远程程序调用(Remote Procedure Call,RPC)portmap守护进程。

    这里只会提到一部分常用端口,下面是给你的一些想法。

    从保留端口号0传入的数据包总是伪造的。这个端口是不能被合法使用的。对TCP端口0~5的探测是端口扫描程序的标志。ssh (22/tcp)、smtp (25/tcp)、dns (53/tcp/udp)、pop-3 (110/tcp)、imap (143/ tcp)和snmp (161/udp)都是最受欢迎的目标端口。它们代表了系统里一些最可能存在潜在漏洞的入口。不论本质上,是因为常见的配置错误,或是软件中的已知瑕疵。因为这些服务过于普遍,因此它们是个绝好的例子:为什么您应该不向外部世界提供这些服务,或十分小心地向外提供服务并控制外部的访问。针对NetBIOS (端口号137-139/tcp/udp)和运行在Windows(445/tcp)的服务器信息块(SMB)协议的探测是极其常见的。它们通常并不会对Linux系统构成威胁,除非Linux系统使用了Samba。这种情况下,探测的典型目标是Windows系统,但这种扫描太过普遍了。隐形扫描从定义来看,隐形端口扫描,意味着它不会被检测到。它们基于TCP协议栈如何响应非预期的数据包或设置了非法的状态标志组合的数据包。例如,一个传入的数据包设置了ACK标志,但却没有相关连接的情况。如果有一个服务器正在监听这个ACK被发送到的端口,TCP协议栈由于无法找到一个相关的连接,它将返回一个TCP的RST消息给发送方,告诉它重置连接。如果ACK被发送到了未使用的端口,系统将简单地返回一个TCP的RST消息以指明错误,就像防火墙默认可能会返回一个ICMP错误消息一样。

    这个问题其实更加复杂,因为一些防火墙仅仅测试SYN标志和ACK标志。如果二者都未设置,或者如果数据包包含一些其他标志组合,则防火墙实现可能会传递该数据包到TCP的代码。依据TCP状态标志组合以及接收数据包的操作系统的不同,系统会使用RST消息响应或保持沉默。这个机制能够被用于辨识目标系统运行着的操作系统。在任何这些情况下,接收到数据包的操作系统都不会在日志中记录这些事件。

    这种诱导目标主机生成一个RST数据包的方式也可以被用于映射一个网络,决定网络里系统在监听的IP地址。如果目标系统不是服务器,并且它的防火墙被设置为默认丢弃无用的数据包时,这种方法格外有效。

    避免偏执:响应端口扫描防火墙日志通常会显示所有类型的失败的连接尝试。探测将是您在日志报告中看到的最常见的东西。

    人们真的有这么频繁地探测您的系统么?是的。您的系统是否缺乏抵抗力呢?不,不会的。好吧,其实未必。这些端口被阻止了。防火墙做了这一切。这些是已被防火墙拒绝了的失败的连接尝试。

    什么时候,您个人会决定报告一个探测?什么时候,花时间报告一个探测真的足够重要么?什么时候,您说着够了够了,然后继续您的生活,或您应该每次都向abuse@some.system写信?这里并没有“正确”的答案。您如何应对是个人的判断,并且部分依赖于您可用的资源,您站点上的数据有多敏感,以及您站点的互联网连接有多么重要。对于明显的探测和扫描,并没有明确的答案。这取决于您的个性和舒适等级,您个人如何定义一个严重的探测以及您的社会公德心。

    考虑到这一点,下面是一些切实可行的指导方针。

    最常见的尝试其实是由自动化探测、错误、基于互联网历史的合法尝试、无知、好奇心和行为不当的软件组合而成的。

    您几乎总是可以安全地忽略由个人、独立的单一连接发起的对于telnet、ssh、ftp、finger或任何其他您未提供的公共端口的请求。探测和扫描是互联网上无法更改的事实,二者的发生都很频繁,但通常不会构成危险。它们有点像挨家挨户推销的销售人员、商业电话、错误的电话号码以及垃圾邮件。对于我来说,至少在一天里没有足够的时间对其一一进行回应。

    另一方面,有些探测者会更执着一些。您可以决定增添一些防火墙规则以完全阻挡它们,或者甚至阻挡它们的整个IP地址空间。

    如果一个开放的端口被发现的话,那么对一个子网中已知可能存在安全漏洞的端口进行扫描的行为通常是一次攻击的先兆。而更具包容性的扫描通常是在域或子网之间进行的查找空缺的边界扫描的一部分。当下的黑客工具会一个接着一个地探测一个子网中的这些端口。

    您偶然会看到严重的黑客企图。这毫无疑问是该采取行动的时候了。记下它们并报告它们。再次检查您的安全性。观察它们在做什么,阻止它们,阻止它们的IP地址块。

    一些系统管理员将每次事件都看得很严重,因为即使他们的计算机是安全的,但他人的计算机可能并不安全。下一个人可能并不具有知晓他/她正被人探测的能力。为了每个人的利益,报告探测行为是一个应当负起的社会责任。

    您应该如何回应端口扫描呢?如果您记录了这些人、他们的邮件管理者、他们上行线路的服务提供者网络运营中心(NOC)或网络地址块协调器,请尽量保持礼貌。在未完全了解之前,不要轻易下结论。过激的反应往往是错误的。看上去像一个严肃的黑客进行的攻击常常是一个好奇的孩子在和一个新程序玩耍。对于滥用者、root用户或邮件管理员的一句好话有时候更有利于问题的解决。更多的人需要关于网络礼节的教育而不是撤回它们的网络账号。它们可能真的是无辜的。就像通常发生的那样,某人的系统被盗用了,而那个人完全不知道发生的事情,它们会感谢您提供的信息。

    然而,探测并不是仅有的不怀好意的流量。探测行为本身是无害的,但DoS攻击却不是。

    2.4.7 拒绝服务攻击DoS攻击基于这样的思想:用数据包淹没您的系统,以打扰或严重地使您的互联网连接降级,捆绑本地服务以导致合法的请求不能被响应,或更严重地,使您的系统一起崩溃。两个最常见的结果便是使系统过于忙碌而不能执行任何有用的业务并且占尽关键系统资源。

    您不能完全地保护自己免受DoS攻击。它们能使用攻击者能想象到的各种形式。任何会导致您的系统进行响应、任何导致您的系统分配资源(包括在日志中记录攻击)、任何诱使一个远程站点停止与您通信的方法都能够在DoS攻击中使用。

    拒绝服务攻击的更多信息 

    这些攻击通常包含多种类型中的一种,包括TCP SYN泛洪(SYN Flood)、ping泛洪(ping-Flood)、UDP泛洪(UDP-Flood)、分片炸弹(fragmentation bombs)、缓冲区溢出(buffer overflow)和ICMP路由重定向炸弹(ICMP routing redirect bomb)。

    TCP SYN泛洪攻击TCP SYN泛洪攻击会消耗您的系统资源直到无法接收更多的TCP连接(见图2.8)。这种攻击利用连接建立过程中基本的三次握手协议,并结合IP源地址欺骗。

    攻击者将他/她的源地址伪装为一个私有地址并向您基于TCP的服务发起一个连接请求。看上去像是一个客户端在尝试开始一个TCP连接,攻击者会向您发送一个人为生成的SYN消息。您的计算机会回复一个SYN-ACK作为响应。然而,在这种情况下,您应答发往的地址并不是攻击者的地址。事实上,由于该地址是私有的,并没有人会进行响应。伪装的主机不会返回一条RST消息以拆除这个半打开的连接。

    TCP连接建立过程中的最后一个阶段,接收一个ACK回应,永远不会发生。因此,有限的网络连接资源被消耗了。连接一直保持半打开的状态,直到连接尝试超时。攻击者用一次又一次的连接请求淹没了您的端口,连接请求的到来比TCP超时释放资源更快。如果这一过程不断持续,所有的资源将被使用,以致无法接收更多到来的连接请求。这不仅仅适用于被探测的服务,而且适用于所有新的连接。

    对于Linux用户来说,有一些急救方法可用。第一个便是之前介绍过的源地址过滤。它会过滤掉最常用于欺骗的源地址,但不能保证可以过滤在合法分类中的伪造的地址。

    第二个便是启用内核的SYN cookie模块,它能显著地延缓由SYN泛洪造成的资源短缺。当连接队列被填满时,系统开始使用SYN cookies而非SYN-ACK来应答SYN请求,它会释放队列中的空间。因此,队列永远不会完全被填满。cookie的超时时间很短暂;客户端必须在很短的时间内进行应答,接下来服务器才会使用客户端期望的SYN-ACK进行响应。cookie是一个基于SYN中的原始序列号、源地址、目的地址、端口号、密值而产生的序列号。如果对此cookie的响应与哈希算法的结果相匹配,服务器便可以合理地确信这个SYN是合法的。

    根据特定的版本,您可能需要(或不需要)使用下面的命令打开内核中的SYN cookie保护功能:echo 1 > /proc/sys/net/ ipv4/tcp_syncookies。一些发行版和内核版本需要您明确地使用make config, make menuconfig或make xconfig配置此选项到内核,并重新编译和安装新内核。

    SYN泛洪和IP地址欺骗 

    请在CERT公告CA-96.21, “TCP SYN Flooding and IP Spoofing Attacks”中查看更多的关于SYN泛洪和IP地址欺骗的信息。ping泛洪任何会引起您的计算机发出响应的消息均可以被用于降低您的网络表现,其原理是强制系统消耗大多数时间进行无用的应答。通过ping发送的ICMP的echo请求消息也是一个常见的元凶。一种叫做蓝精灵(Smurf)的攻击和它的变种会强制系统消耗资源在echo应答上。完成此任务的一种方法是将源地址伪装成受害者的源地址并向整个主机所在的网络广播echo请求。一条欺骗性的请求消息能够造成数百或数千计的响应被发送到受害者处。另一种达成相似结果的方法是在互联网上被盗用的主机里安装木马程序,并定时同时向一台主机发送echo请求。最后,攻击者发送更多简单的ping泛洪来淹没数据连接是DoS攻击的另一种方式,尽管它越来越少见。一个典型的ping泛洪见图2.9。

    死亡之ping一种更老些的攻击方式(exploit[1])叫做死亡之ping(Ping of Death),它会发送非常大的ping数据包。易受攻击的系统可能因此崩溃。Linux中并没有此漏洞,其他当代的类UNIX操作系统也不存在此漏洞。如果您的防火墙在保护老式的系统或个人计算机,那么这些系统可能存在此漏洞。

    死亡之ping的攻击方式给了我们一个思路,这些最简单的协议和消息互动是如何被具有创造力的黑客利用的。并不是所有的攻击都在尝试闯入您的计算机。有一些仅仅是破坏您的系统。在这种情况下,攻击的目标便是令您的计算机崩溃(系统崩溃也是一个标志,它意味着您需要检查您的系统是否安装了木马程序。您可能已经被欺骗加载了一个木马程序,但这个程序需要系统重新启动以激活自身)。

    ping是一个非常有用的基本网络工具。您可能不想连ping一起禁用掉。在今天的互联网环境里,保守的人们建议禁用传入的ping消息或至少严格限制您接收哪些用户的echo请求。由于ping在DoS攻击中使用的历史,许多站点不再对任何(除部分特别挑选的)外部源发送的ping请求进行响应。相比针对应用和协议栈中其他协议的更加无处不在和危险的威胁,基于ICMP的DoS威胁相对较小,这种行为看起来总像是一种过度反应。

    然而,对于受害的主机来说,丢弃ping请求并不是一个解决方案。不论对到来的泛滥的数据包做何反应,系统(或网络)依旧会被淹没在检测和丢弃泛洪请求的过程中。

    UDP泛洪UDP协议格外适合用于DoS工具。不同于TCP,UDP是无状态的。由于没有流控制的机制,它不存在连接的状态标志。数据报序号也没有。没有任何信息被维护以指明下一个期望到来的数据包。并不总是有方法根据端口号将服务器流量和客户端的流量区分开来。由于不存在状态,也没有方法把期望的到来的响应和出乎意料的来路不明的数据包区分开来。很容易使系统忙于对传入的UDP探测进行响应,以致没有带宽留给正当的网络流量。

    由于UDP服务易受这些类型攻击的影响(与基于连接的TCP服务不同),许多站点禁用了所有非必要的UDP端口。就像之前提到的那样,几乎所有常见的互联网服务都基于TCP。我们将在第5章建立的防火墙中仔细地限制UDP流量,只允许那些提供必要UDP服务的远程主机。

    经典的UDP泛洪攻击涉及两个受害的计算机或是像Smurf的ping泛洪那样工作(见图2.10)。一条从攻击者的UDP echo端口发出的,定向到某个主机的UDP chargen端口的欺骗数据包,会导致无限循环的网络流量。echo和chargen都是网络测试服务。chargen生成一个ASCII的字符串。echo返回发送到此端口的数据。

    UDP端口拒绝服务攻击 

    想要基于UDP服务的DoS攻击的更详细的描述,请查阅CERT公告CA-96.01, “UDP Port Denial-of-Service Attack”。分片炸弹不同的基础网络技术(例如以太网、异步传输模式[ATM]和令牌环)定义了第二层数据帧不同的大小限制。在数据包从一个路由器沿路径(从源计算机到目的计算机)到下一个路由器时,网关路由器可能需要在将它们传递到下一个网络前将数据包分切为更小的片段,称为分片。在合理的分片里,第一个分片会包含UDP或TCP报头中通常的源端口号和目的端口号。而接下来的分片则不包含。

    例如,尽管最大理论数据包长度是65535字节,而以太网最大帧长度(MaximumTransmission Unit,MTU)为1500字节。

    当数据被分片时,中间路由器不会重组数据包。而数据包会被目的主机或邻近的路由器重新组装。

    由于中间进行的分片基本上比发送更小的、无需分片的数据包代价更高,目前的系统通常会在向目的主机发起连接前进行MTU发现。这是通过发送在IP报头选项域中设置了不分片(Don’t Fragment)标志(当前通常唯一的合法使用的IP选项域)实现的。如果中间路由器必须对数据包进行分片,它会丢弃数据包并返回ICMP 3错误消息,即“需要分片”(fragmentation-required)。

    一种分片攻击涉及人为构造的非常小的数据包。一个字节的数据包会导致一些操作系统的崩溃。当今的操作系统通常会对该情况进行测试。

    另一个对小分片的使用是构造最初的分片,使得UDP或TCP的源端口和目的端口都包含在第二个分片中。(所有网络的MTU大小都足够传递标准的40字节IP和传输层报头。)数据包过滤防火墙通常会允许这些分片通过,因为它们过滤所基于的信息还未呈现。这种攻击很有用,它可以使数据包穿过本不被允许穿过的防火墙。

    之前提到的死亡之ping便是使用分片携带非法的超大ICMP消息的例子。当ping请求被重构时,整个数据包的大小超过65535字节,因此导致一些系统的崩溃。

    利用分片的经典例子是泪滴攻击(Teardrop attack)。这种方法能够被用于穿过防火墙或使系统崩溃。第一个分片被构造并被送到一个可用的服务(许多防火墙并不检查第一个数据包之后的分片)。如果它被允许,接下来的分片将穿过防火墙并被目标主机重新组装。如果第一个数据包被丢弃,那么随后的数据包将穿过防火墙,但最终主机不会重新组装该部分数据包,并将在最后丢弃它们。

    接下来的分片中的数据偏移字段可以被更改,通过覆盖第一个分片中的端口信息,可以访问不被允许的服务。这个偏移量可以被修改,以致数据包重新组装时使用的偏移量可以变成负数。由于内核字节拷贝程序通常使用无符号的数,这个负值被当作一个非常大的正数;拷贝的结果是污染了核心内存和系统崩溃。

    防火墙计算机和为其他本地主机充当NAT的主机应该配置为在将数据包交付给本地目的主机之前进行重新组装的方式。一些iptables的功能需要系统在转发数据包到目的主机前重组数据包,而重组是自动进行的。

    缓冲区溢出缓冲区溢出攻击无法通过过滤防火墙进行保护。这种攻击主要分两类。第一类是简单地通过覆盖其数据空间或运行时堆栈导致系统或服务崩溃。第二类则需要专业技术以及对硬件、系统软件或被攻击的软件版本的了解。溢出的目的是为了覆盖程序的运行时堆栈,因此调用的返回堆栈会包含一个程序,并且会跳转到那里。这个程序通常以root权限启动一个shell。

    服务器中许多当前的隐患都是缓冲区溢出的结果。因此,安装并且保持所有最新的补丁和软件版本十分重要。

    ICMP重定向炸弹ICMP重定向消息类型5会告知目标系统改变内存中的路由表以获得更短的路由。重定向由路由器发送到它的邻居主机。它们的目的是通知主机有更短的路径可用(即,主机和新的路由器在同一个网络中,并且原来的路由器会路由数据到新的路由器的下一跳)。

    重定向几乎每天都会到来。它们很少发源于附近的路由器。对于连接到一个ISP的住宅或商用站点来说,您附近的路由器产生一个重定向消息的可能性非常小。

    如果您的主机使用静态路由,并且收到了重定向消息,这可能是有人在愚弄您的系统,以让它认为一个远程计算机是您的本地计算机或您的ISP的计算机,甚至欺骗您的系统以转发所有的流量到另一个远程主机处。

    拒绝服务攻击和其他系统资源网络连通性并不是DoS攻击唯一考虑的。这里有一些在配置您的系统时应当牢记的其他领域的例子。

    如果您的系统强制写大量的消息到错误日志或被许多很大的邮件消息淹没,那么您的文件系统可能会溢出。您也许想要配置资源限制并为快速增长设置独立的分区或改变文件系统。系统内存、进程表槽、CPU周期以及其他资源可以被重复、快速的网络服务调用消耗殆尽。除了为每个独立的服务设置限制,您对此能做的实在有限:启用SYN cookies,丢弃而不是驳回那些发往不被支持的服务端口的数据包。邮件拒绝服务攻击 

    关于使用邮件进行的DoS攻击的更详细信息,请参照“Email Bombing and Spamming”。2.4.8 源路由数据包源路由数据包使用一个很少用的IP选项,该选项允许定义两台计算机之间的路由选择,而不是由中间路由器定义路径。正如ICMP重定向一样,这个功能可以允许某人愚弄您的系统:让它认为它在与一台本地计算机、ISP计算机或其他可信赖的主机通信,或为中间人攻击(man-in-the-middle attack)产生必要的数据包流。

    源路由在当前的网络中很少有合理的使用。有些路由器会忽略该选项。一些防火墙则丢弃包含此选项的数据包。

    相关资源:Linux防火墙(原书第3版).pdf
    最新回复(0)