目录
SMTP
因特网中的电子邮件
一个简单的例子
什么是SMTP
SMTP的缺点
用SMTP传输一个邮件的过程
SMTP是如何将一个报文从发送邮件服务器传送到接收邮件服务器的。
SMTP与HTTP的区别
共同点
不同点
邮件报文格式
邮件访问协议
POP3
IMAP
基于Web的电子邮件
DNS
DNS:因特网的目录结构
DNS提供的服务
DNS的工作原理
分布式、层次数据库
DNS缓存
DNS 记录和报文
DNS记录
DNS报文
在DNS数据库中插人记录
DNS安全性
首先我们要明白不管DNS还是SMTP都是运行在应用层的,所以我们理解他们并不能超过应用层;
下图给出了因特网电子邮件系统的总体情况。从该图中我们可以看到它有3个主要组成部分:
用户代理(user agent)、邮件服务器( mail server)和简单邮件传输协议( Simple Mail Transfer Protocol, SMTP)。
假设两个人在使用电子邮件服务,那我们来模拟一下这个过程;A给B发送电子邮件;
当A完成了对邮件的撰写时,他的邮件代理向其邮件服务器发送邮件,此时邮件被放在邮件服务器的外出报文队列。当B要阅读报文时,他的用户代理在其邮件服务器的邮箱里取得该报文。
分析该过程
A的邮箱也必须能处理B的邮件服务器故障。如果A的服务器不能将邮件交付给B的服务器,A的邮件服务器在一个报文队(messagequeue)中保持该报文并在以后尝试再次发送。通常每30分钟左右进行一次尝试;如果几天后仍不能成功,服务器就删除该报文并以电子邮件的形式通知发送方(A)。
SMTP是因特网电子邮件中主要的应用层协议。它使用TCP可靠数据传输服务,从发送方的邮件服务器向接收方的邮件服务器发送邮件。
像大多数应用层协议一样,SMTP也有两个部分:
注意:当一个邮件服务器向其他邮件服务器发送邮件时,它就表现为SMTP的客户;当邮件服务器从其他邮件服务器上接收邮件时,它就表现为一个SMTP的服务器。
尽管电子邮件应用在因特网上的独特地位可以证明SMTP有着众多非常出色的性质,但它所具有的某种陈旧特征表明它仍然是一种继承的技术限制所有邮件报文的体部分(不只是其首部)只能采用简单的7比特ASCII表示。在20世纪80年代早期,这种限制是明智的,因为当时传输能力不足,没有人会通过电子邮件发送大的附件或是大的图片、声音或者视频文件。然而,在今天的多媒体时代,7位ASCII的限制的确有点痛苦,即在用SMTP传送邮件之前,需要将二进制多媒体数据编码ASCII 码,并且在使用SMTP传输后要求将相应的ASCII码邮件解码还原为多媒体数据。
SMTP 一般不使用中间邮件服务器发送邮件,即使这两个邮件服务器位于地球的两端也是这样。
假设A的邮件服务器在中国香港,而B的服务器在美国圣路易斯,那么这个TCP连接也是从香港服务器到圣路易斯服务器之间的直接相连。特别是,如果B的邮件服务器没有开机,该报文会保留在A的邮件服务器上等待进行新的尝试,这意味着邮件并不在中间的某个邮件服务器存留。
简单地说,SMTP与人类面对面交往的行为方式有许多类似性。
首先,客户SMTP (运行在发送邮件服务器主机上)在25号端口建立一个到服务器SMTP (运行在接收邮件服务器主机上)的TCP连接。如果服务器没有开机,客户会在稍后继续尝试连接。一旦连接建立,服务器和客户执行某些应用层的握手,就像人们在互相交流前先进行自我介绍一样。SMTP的客户和服务器在传输信息前先相互介绍。在SMTP握手的阶段,SMTP客户指示发送方的邮件地址(产生报文的那个人)和接收方的邮件地址。一旦该SMTP客户和服务器彼此介绍之后,客户发送该报文。SMTP能依赖TCP提供的可靠数据传输无差错地将邮件投递到接收服务器。该客户如果有另外的报文要发送到该服务器,就在该相同的TCP连接上重复这种处理;否则,它指示TCP关闭连接。
这两个协议都用于从一台主机向另一台主机传送文件:
HTTP从Web服务器向Web客户(通常是一个浏览器)传送文件(也称为对象);
SMTP从一个邮件服务器向另一个邮件服务器传送文件( 即电子邮件报文)。
当进行文件传送时,持续的HTTP和SMTP都使用持续连接。因此,这两个协议有一些共同特征。
每个首部必须含有一个From:首部行和一个To:首部行;一个首部也许包含一个Subject:首部行以及其他可选的首部行。如下:
From: [email protected]
To: [email protected]
Subject: Searching for the meaning of life.
在报文首部之后,紧接着一个空白行,然后是以ACSII格式表示的报文体。
(1)如果一旦SMTP将邮件报文从A的邮件服务器交付给B的邮件服务器,该报文就被放入了B 的邮箱中。我们假定B是通过登录到服务器主机,并直接在该主机上运行一个邮件阅读程序来阅读他的邮件的。直到20世纪90年代早期,这都是一种标准方式。而在今天,邮件访问使用了一种客户——服务器体系结构,即典型的用户通过在用户端系统上运行的客户程序来阅读电子邮件,这里的端系统可能是办公室的PC、便携机或者是智能手机。通过在本地主机上运行邮件客户程序,用户享受一系列丰富的特性,包括查看多媒体报文和附件的能力。
(2)假设B(接收方)在其本地PC上运行用户代理程序,考虑在他的本地PC上也放置一个邮件服务器是自然而然的事。在这种情况下,A的邮件服务器就能直接与B的PC进行对话了。然而这种方法会有一个问题。前面说过邮件服务器管理用户的邮箱,并且运行SMTP的客户端和服务器端。如果B的邮件服务器位于他的PC上,那么为了能够及时接收可能在任何时候到达的新邮件,他的PC必须总是不间断地运行着并一直保持在线。这对于许多因特网用户而言是不现实的。相反,典型的用户通常在本地PC上运行一个用户代理程序,而它访问存储在总是保持开机的共享邮件服务器上的邮箱。该邮件服务器与其他用户共享,并且通常由用户的ISP进行维护(如大学或公司)。
现在我们考虑当从A向B发送一个电子邮件报文时所取的路径。我们刚才已经知道,在沿着该路径的某些点上,需要将电子邮件报文存放在B的邮件服务器上。通过让A的用户代理直接向B 的邮件服务器发送报文,就能够做到这一点。这能够由SMTP来完成;实际上,SMTP被设计成将电子邮件从一台主机推到另一台主机。然而,通常A的用户代理和B的邮件服务器之间并没有一个直接的SMTP对话。相反,如图所示,A的用户代理用SMTP将电子邮件报文推入她的邮件服务器,接着她的邮件服务器(作为一个SMTP客户)再用SMTP将该邮件中继到B的邮件服务器。
那为什么该过程要分成两步呢?
因为不通过A的邮件服务器进行中继,A的用户代理将没有任何办法到达一个不可达的目的地接收服务器。通过首先将邮件存放在自己的邮件服务器中,A的邮件服务器可以重复地尝试向B的邮件服务器发送该报文,如每30分钟一次,直到Bob的邮件服务器变得运行为止。(并且如果A的邮件服务器关机,她则能向系统管理员进行申告!) SMTP RFC文档定义了如何使用SMTP命令经过多个SMTP服务器进行报文中继。
如果像B这样的接收方,是如何通过运行其本地PC上的用户代理,获得位于他的某ISP的邮件服务器上的邮件呢?值得注意的是Bob的用户代理不能使用SMTP得到报文,因为取报文是一个拉操作,而SMTP协议是一个推协议。通过引入一个特殊的邮件访问协议来解决这个难题,该协议将Bob邮件服务器上的报文传送给他的本地PC。目前有一些流行的邮件访问协议,包括第三版的邮局协议( PostOffice Protocol Version 3,POP3)、 因特网邮件访问协议( Internet Mail Access Protocol ,IMAP)以及HTTP。
POP3是一个极为简单的邮件访问协议,由RFC 1939进行定义。文档RFC 1939简短且可读性强。因为该协议非常简单,故其功能相当有限。
当用户代理(客户)打开了一个到邮件服务器(服务器)端口110上的TCP连接后,POP3 就开始工作了。随着建立TCP连接,POP3 按照三个阶段进行工作:特许( authorization)、事务处理以及更新。
在POP3的事务处理过程中,用户代理发出一些命令,服务器对每个命令做出回答。回答可能有两种:
特许阶段有两个主要的命令: user < user name>和pass < password>。建议直接用Telnet登录到POP3服务器的110端口,然后发出这两个命令。假设邮件服务器的名字为mailServer,那么你将看到类似的过程:
telnet mailServer 110
+OK POP3 server ready
user bob
+OK
pass hungry
+OK user successfully logged on
如果你的命令拼写错了,该POP3服务器将返回一个ERR报文。
事务处理过程。使用POP3的用户代理通常被用户配置为“下载并删除”或者“下载并保留”方式。POP3用户代理发出的命令序列取决于用户代理程序被配置为这两种工作方式的哪一种。 使用下载并删除方式,用户代理发出list、retr 和dele命令。举例来说,假设用户在他(她)的邮箱里有两个报文。在下面的对话中,C: (代表客户)是用户代理,S: (代表服务器)是邮件服务器。事务处理过程将类似于如下过程:
C: list
S: 1 498
S: 2 912
S: .
C: retr 1
S: (blah blah...
S: ...................
S: ..........blah)
S: .
C: dele 1
C: retr 2
S: (blah blah ...
S: ..................
S: ..........blah)
S: .
C: dele 2
C: quit
S: +OK POP3 server. signing off
用户代理首先请求邮件服务器列出所有存储的报文的长度。接着用户代理从邮件服务器取回并删除每封邮件。注意到在特许阶段以后,用户代理仅使用四个命令list、retr、 dele和quit,这些命令的语法定义在RFC 1939中。
在处理quit命令后,POP3服务器进入更新阶段,从用户的邮箱中删除邮件1和2。使用下载并删除方式存在的问题是,邮件接收方B可能是移动的,可能希望从多个不同的机器访问他的邮件报文,如从办公室的PC、家里的PC或他的便携机来访问邮件。下载并删除方式将对Bob的邮件报文根据这了台机器进行划分,特别是如果B最先是在他办公室的PC上收取了一条邮件,那么晚上当他在家里时,通过他的便携机将不能再收取该邮件。使用下载并保留方式,用户代理下载某邮件后,该邮件仍保留在邮件服务器上。这时,B就能通过不同的机器重新读取这些邮件;他能在工作时收取一封报文,而在工作回家后再次访问它。
在用户代理与邮件服务器之间的POP3会话期间,该POP3服务器保留了一些状态信息;特别是记录了哪些用户报文被标记为删除了。然而,POP3 服务器并不在POP3会话过程中携带状态信息。会话中不包括状态信息大大简化了POP3服务的实现。
在使用POP3访问时,一旦B将邮件下载到本地主机后,他就能建立邮件文件夹,并将下载的邮件放人该文件夹中。然后B可以删除报文,在文件夹之间移动报文,并查询报文(通过发送方的名字或报文主题)。
如果换个一台机器,就看不到这个文件夹,能不能把这些文件夹创建在服务器呢?
使用POP3是不可能做到这一点的,POP3协议没有给用户提供任何创建远程文件夹并为报文指派文件夹的方法。为了解决这个或其他一些问题,由RFC 3501定义的因特网邮件访问协议(IMAP) 应运而生。
和POP3一样,IMAP是一个邮件访问协议,但是它比POP3具有更多的特色,不过也比POP3复杂得多。( 因此客户和服务器端的实现也都复杂得多。)IMAP服务器把每个报文与一个文件夹联系起来;当报文第一次到达服务器时,它与收件人的INBOX文件夹相关联。收件人则能够把邮件移到一个新的、用户创建的文件夹中,阅读邮件,删除邮件等。IMAP 协议为用户提供了创建文件夹以及将邮件从一个文件夹移动到另一个文件夹的命令。IMAP还为用户提供了在远程文件夹中查询邮件的命令,按指定条件去查询匹配的邮件。值得注意的是,与POP3不同,IMAP服务器维护了IMAP会话的用户状态信息,例如,文件夹的名字以及哪些报文与哪些文件夹相关联。
IMAP的另一个重要特性是它具有允许用户代理获取报文某些部分的命令。例如,一个用户代理可以只读取一个报文的报文首部,或只是一个多部分MIME报文的一部分。当用户代理和其邮件服务器之间使用低带宽连接(如一个低速调制解调器链路)的时候,这个特性非常有用。使用这种低带宽连接时,用户可能并不想取回他邮箱中的所有邮件,尤其要避免可能包含如音频或视频片断的大邮件。
使用这种服务,用户代理就是普通的浏览器,用户和他远程邮箱之间的通信则通过HTTP进行。当一个收件人(如B),想从他的邮箱中访问一个报文时,该电子邮件报文从B的邮件服务器发送到他的浏览器,使用的是HTTP而不是POP3或者IMAP协议。当发件人(如A)要发送一封电子邮件报文时,该电子邮件报文从A的浏览器发送到她的邮件服务器,使用的是HTTP而不是SMTP。然而,Alice的邮件服务器在与其他的邮件服务器之间发送和接收邮件时,仍然使用的是SMTP。
因特网上的主机和人类一样, 可以使用多种方式进行标识。主机的一种标识方法是用它的主机名( hostname),如www. facebook. com、www. google. com、gaia. cs. umass. edu以及cis. poly. edu等,这些名字便于记忆也乐于被人们接受。然而,主机名几乎没有提供(即使有也很少)关于主机在因特网中位置的信息。(一个名 为www. eurecom. fr的主机以国家码. fr结束,告诉我们该主机很可能在法国,仅此而已。)
因为主机名可能由不定长的字母数字组成,路由器难以处理。由于这些原因,主机也可以使用所谓IP地址( IP address)进行标识。
一个IP地址由4个字节组成,并有着严格的层次结构。例如121.7. 106.83这样一个IP地址,其中的每个字节都被句点分隔开来,表示了0~255的十进制数字。我们说IP地址具有层次结构,是因为当我们从左至右扫描它时,我们会得到越来越具体的关于主机位于因特网何处的信息( 即在众多网络的哪个网络里)。类似地,当我们从下向上查看邮政地址时,我们能够获得该地址位于何处的越来越具体的信息。
识别主机有两种方式,通过主机名或者IP地址。人们喜欢便于记忆的主机名标识方式,而路由器则喜欢定长的、有着层次结构的IP地址。为了折中这些不同的偏好,我们需要一种能进行主机名到IP地址转换的目录服务。这就是域名系统( Domain Name System, DNS)的主要任务。
DNS通常是由其他应用层协议所使用的,包括HTTP、SMTP和FTP,将用户提供的主机名解析为IP地址。
举一个例子,考虑运行在某用户主机上的一个浏览器( 即一个HTTP客户)请求URL www.someschool. edu/ index. html页面时会发生什么现象。为了使用户的主机能够将一个HTTP请求报文发送到Web服务器www. someschool. edu,该用户主机必须获得www. someschool. edu的IP地址。其做法如下。
从这个例子中,我们可以看到DNS给使用它的因特网应用带来了额外的时延,有时还相当可观。
幸运的是,想获得的IP地址通常就缓存在一个“附近的”DNS服务器中,这有助于减少DNS的网络流量和DNS的平均时延。
除了进行主机名到IP地址的转换外,DNS还提供了一些重要的服务:
假设运行在用户主机上的某些应用程序(如Web浏览器或邮件阅读器)需要将主机名转换为IP地址。这些应用程序将调用DNS的客户端,并指明需要被转换的主机名(在很多基于UNIX的机器上,应用程序为了执行这种转换需要调用函数gethostbyname())。用户主机上的DNS接收到后,向网络中发送一个DNS查询报文。所有的DNS请求和回答报文使用UDP数据报经端口53发送。经过若干毫秒到若干秒的时延后,用户主机上的DNS接收到一个提供所希望映射的DNS回答报文。这个映射结果则被传递到调用DNS的应用程序。因此,从用户主机上调用应用程序的角度看,DNS是一个提供简单、直接的转换服务的黑盒子。但事实上,实现这个服务的黑盒子非常复杂,它由分布于全球的大量DNS服务器以及定义了DNS服务器与查询主机通信方式的应用层协议组成。DNS的一种简单设计是在因特网上只使用一个DNS服务器,该服务器包含所有的映射。在这种集中式设计中,客户直接将所有查询直接发往单一的DNS服务器,同时该DNS服务器直接对所有的查询客户做出响应。尽管这种设计的简单性非常具有吸引力,但它不适用于当今的因特网,因为因特网有着数量巨大(并持续增长)的主机。这种集中式设计的问题包括:
总的来说,在单一DNS服务器上运行集中式数据库完全没有可扩展能力。因此,DNS采用了分布式的设计方案。事实上,DNS是一个在因特网上实现分布式数据库的精彩范例。
为了处理扩展性问题,DNS使用了大量的DNS服务器,它们以层次方式组织,并且分布在全世界范围内。没有一台DNS服务器拥有因特网上所有主机的映射。相反,这些映射分布在所有的DNS服务器上。大致说来,有3种类型的DNS服务器:根DNS服务器、顶级域(Top- Level Domain, TLD) DNS服务器和权威DNS服务器。这些服务器以图所示的层次结构组织起来。
假定一个DNS客户要决定主机名www. amazon. com的IP地址。粗略说来,将发生下列事件。客户首先与根服务器之一联系,它将返回顶级域名com的TLD服务器的IP地址。该客户则与这些TLD服务器之一联系,它将为amazon. com返回权威服务器的IP地址。最后,该客户与amazon. com权威服务器之一联系, 它为主机名www. amazon. com返回其IP地址。我们将很快更为详细地考察DNS查找过程。不过我们先仔细看一下这3种类型的DNS服务器。
还有另一类重要的DNS服务器,称为本地DNS服务器( local DNServer)。 严格说来,一个本地DNS服务器并不属于该服务器的层次结构,但它对DNS层次结构是至关重要的。每个ISP (如一个居民区的ISP或一个机构的ISP)都有一台本地DNS服务器( 也叫默认名字服务器)。当主机与某个ISP连接时,该ISP提供一台主机的IP地址,该主机具有一台或多台其本地DNS服务器的IP地址( 通常通过DHCP)。通过访问Windows或UNIX的网络状态窗口,用户能够容易地确定他的本地DNS服务器的IP地址。主机的本地DNS服务器通常“邻近”本主机。对某机构ISP而言,本地DNS服务器可能就与主机在同一个局域网中;对于某居民区ISP来说,本地DNS服务器通常与主机相隔不超过几台路由器。当主机发出DNS请求时,该请求被发往本地DNS服务器,它起着代理的作用,并将该请求转发到DNS服务器层次结构中,我们下面将更为详细地讨论。
DNS缓存( DNScaching)。为了改善时延性能并减少在因特网上到处传输的DNS报文数量,DNS广泛使用了缓存技术。
DNS 缓存的原理非常简单。在一个请求链中,当某DNS服务器接收一个DNS回答(例如,包含某主机名到IP地址的映射)时,它能将映射缓存在本地存储器中。如图:每当本地DNS服务器dns. nyu. edu从某个DNS服务器接收到一个回答,它能够缓存包含在该回答中的任何信息。如果在DNS服务器中缓存了一台主机名/IP地址对,另一个对相同主机名的查询到达该DNS服务器时,该DNS服务器就能够提供所要求的IP地址,即使它不是该主机名的权威服务器。由于主机和主机名与IP地址间的映射并不是永久的,DNS服务器在一段时间后 (通常设置为两天)将丢弃缓存的信息。
举一个例子,假定主机apricot. nyu. edu向dns. nyu. edu查询主机名cnn. com的IP地址。此后,假定过了几个小时,纽约大学的另外一台主机如kiwi. nyu. edu也向dns. nyu. edu查询相同的主机名。因为有了缓存,该本地DNS服务器可以立即返回cnn.com的IP地址,而不必查询任何其他DNS服务器。本地DNS服务器也能够缓存TLD服务器的IP地址,因而允许本地DNS绕过查询链中的根DNS服务器。事实上,因为缓存,除了少数DNS查询以外,根服务器被绕过了。
资源记录是一个包含了下列字段的4元组:(Name, Value, Type,TTL)TTL是该记录的生存时间,它决定了资源记录应当从缓存中删除的时间。在下面给出的记录例子中,我们忽略掉TTL字段。Name 和Value的值取决于Type:
如果一台DNS服务器是用于某特定主机名的权威DNS服务器,那么该DNS服务器会有一条包含用于该主机名的类型A记录( 即使该DNS服务器不是其权威DNS服务器,它也可能在缓存中包含有一条类型A记录)。如果服务器不是用于某主机名的权威服务器,那么该服务器将包含一 条类型NS记录,该记录对应于包含主机名的域:它还将包括一条类型A记录,该记录提供了在NS记录的Value 字段中的DNS服务器的IP地址。
举例来说,假设一台edu TLD服务器不是主机gaia. cs. umass. edu的权威DNS服务器,则该服务器将包含一条包括主机cs. umass. edu的域记录,如( umas. edu, dns. umass. edu, NS);该edu TLD服务器还将包含一条类型A记录,如(dns. umass. edu, 128. 119. 40. 111, A),该记录将名字dns. umass. edu映射为-个IP地址。
假定你刚刚创建一个称为网络乌托邦( Network Utopia)的令人兴奋的新创业公司。你必定要做的第一件事是在注册登记机构注册域名networkutopia. com。注册登记机构(registrar) 是一个商业实体,它验证该域名的唯一 性,将该域名输入DNS数据库(如下面所讨论的那样),对提供的服务收取少量费用。1999 年前,唯一的注册登记机构是Nework Solution,它独家经营对于com、net和org域名的注册。但是现在有许多注册登记机构竞争客户,因特网名字和地址分配机构( Internet Corporation for Assigned Names and Numbers, ICANN)向各种注册登记机构授权。在http://www. internie. net.上可以找到授权的注册登记机构的列表。当你向某些注册登记机构注册域名networkutopia. com时,需要向该机构提供你的基本和辅助权威DNS服务器的名字和IP地址。假定该名字和IP地址是dns1. networkutopia. com和dns2. networkutopia. com及212. 212.212. 1和212. 212. 212.2。对这两个权威DNS服务器的每一个, 该注册登记机构确保将一个类型 NS和一个类型A的记录输人TLD com服务器。特别是对于用于networkutopia. com的基本权威服务器,该注册登记机构将下列两条资源记录插人该DNS系统中:
(ne tworkutopia. com, dns1 . ne tworkutopia. com,NS)
(dns1. networkutopia.com,212.212.212.1, A)
必须确保用于Web服务器www. networkutopia. com的类型A资源记录和用于邮件服务器mail. networkutopia. com的类型MX资源记录被输人你的权威DNS服务器中。(直到最近,每台DNS服务器中的内容都是静态配置的,例如来自系统管理员创建的配置文件。最近,在DNS协议中添加了一一个更新(UPDATE) 选项,允许通过DNS报文对数据库中的内容进行动态添加或者删除。[RFC2136]和[RFC 3007]定义了DNS动态更新。)
一旦完成所有这些步骤,人们将能够访问你的Web站点,并向你公司的雇员发送电子邮件。
DNS是因特网基础设施的一个至关重要的组件,对于包括Web、电子邮件等的许,多重要的服务,没有它都不能正常工作。因此,我们自然要问,DNS怎么能够被攻击呢? DNS是一个易受攻击的目标吗?它是将会被淘汰的服务吗?大多数因特网应用会随同它一起无法工作吗?
想到的第一种针对DNS服务的攻击是分布式拒绝服务(DDoS) 带宽洪泛攻击。例如,某攻击者能够试图向每个DNS根服务器发送大量的分组,使得大多数合法DNS请求得不到回答。这种对DNS根服务器的DDoS大规模攻击实际发生在2002年10月21日。在这次攻击中,该攻击者利用一个僵尸网络向13个DNS根服务器中的每个都发送了大批的ICMP ping报文负载。运的是,这种大规模攻击所带来的损害很小,对用户的因特网体验几乎没有或根本没有影响。攻击者的确成功地将大量的
分组指向了根服务器,但许多DNS根服务器受到了分组过滤器的保护,配置的分组过滤器阻挡了所有指向根服务器的ICMP ping报文。这些被保护的服务器因此未受伤害并且与平常一样发挥着作用。此外,大多数本地DNS服务器缓存了顶级域名服务器的IP地址,使得这些请求过程通常绕过了DNS根服务器。对DNS的潜在更为有效的DDoS攻击将是向顶级城名服务器(例如向所有处理.com
域的顶级域名服务器)发送大量的DNS请求。过滤指向DNS服务器的DNS请求将更为困难,并且顶级域名服务器不像根服务器那样容易绕过。但是这种攻击的严重性通过本地DNS服务器中的缓存技术可将部分地被缓解。DNS能够潜在地以其他方式被攻击。在中间人攻击中,攻击者截获来自主机的请求并返回伪造的回答。在DNS毒害攻击中,攻击者向一台DNS服务器发送伪造的回答,诱使服务器在它的缓存中接收伪造的记录。这些攻击中的任一种,都能够将毫无疑虑的Web用户重定向到攻击者的Web站点。
然而,这些攻击难以实现,因为它们要求截获分组或扼制住服务器[ Skoudis 2006 ]。总而言之,DNS自身已经显示了对抗攻击的令人惊讶的健壮性。至今为止,还没有一个攻击已经成功地妨碍了DNS 服务。