我正在阅读关于Google新的公共DNS服务的一些说明:
我注意到这一段的安全部分:
直到标准的系统范围的DNS漏洞解决scheme普遍实施(如DNSSEC2协议),开放的DNSparsing器需要独立采取一些措施来减轻已知的威胁。 已经提出了许多技术; 请参阅IETF RFC 4542:使DNS更加适应虚构应答的措施 ,其中大部分概述。 在Google Public DNS中,我们已经实施了以下方法,并build议您采取以下措施:
- 过度configuration机器资源以防止对parsing器本身造成直接的DoS攻击。 由于IP地址对于攻击者来说是微不足道的,所以不可能阻止基于IP地址或子网的查询。 处理这种攻击的唯一有效方法是简单地吸收负载。
这是令人沮丧的认识; 即使在堆栈溢出/服务器故障/超级用户,我们经常使用IP地址作为各种禁止和阻止的基础。
认为一个“天赋”的攻击者可以轻易地使用任何他们想要的IP地址,并合成尽可能多的独特的假IP地址,是非常可怕的!
所以我的问题是:
正如许多其他人所说的,只要不关心接收响应,IP头文件就很容易伪造。 这就是为什么它最常见于UDP,因为TCP需要3次握手。 一个明显的例外是SYN flood ,它使用TCP并尝试绑定接收主机上的资源; 再次,作为答复被丢弃,源地址并不重要。
攻击者欺骗源地址的能力特别讨厌的副作用是后向散射攻击。 这里有一个很好的描述,但简单地说,这是一个传统的DDoS攻击的反面:
在(3)中提到的任何一种情况下,许多主机将响应ICMP不可达或TCP重置,针对恶意数据包的源地址 。 攻击者现在可能有成千上万的不妥协的机器在他/她select的受害者身上执行DDoS攻击,所有这些都通过使用伪造的源IP地址来实现。
在缓解方面,这种风险实际上只有ISP(特别是ISP提供客户接入,而不是过境)能够解决的风险。 有两种主要的做法:
入口过滤 – 确保进入您networking的数据包来自位于入站接口远端的地址范围。 许多路由器厂商实现了单播反向path转发等function ,它们使用路由器的路由和转发表来validation传入数据包的源地址的下一跳是否为传入接口。 这最好在networking的第一层3跳(即默认网关)中执行。
出口过滤 – 确保离开您networking的数据包只能从您拥有的地址范围中获取。 这是入口过滤的自然补充,实质上是“好邻居”的一部分。 确保即使您的networking受到恶意stream量的危害,也不会将该stream量转发给您的networking。
这两种技术在“边缘”或“访问”networking中都是最有效和最容易实现的,客户端与提供者进行交互。 由于多path和非对称路由的复杂性,在接入层之上实现入口/出口过滤变得更加困难。
我已经看到这些技术(特别是入口过滤)在企业networking中使用效果很好。 也许有更多服务提供商经验的人可以更深入地了解在互联网上部署入站/出站过滤所面临的挑战。 我认为硬件/固件支持是一个很大的挑战,也无法迫使其他国家的上游供应商实施类似的政策。
攻击者在野外伪造IP地址真的很容易吗?
当然,如果我不在乎实际收到任何回应,我可以很容易地使用任何我喜欢的源地址发送数据包。 由于许多互联网服务供应商并不具备良好的出口规则,所以我一般会伪造任何东西。
如果攻击者确实需要双向通信,则变得非常困难。 如果他们需要双向沟通,那么简单地使用某种代理就容易了。 如果你知道自己在做什么,那么设置起来非常简单。
由于网站使用http / https需要双向通信,因此通过IP地址禁止人员在SF / SO / SU上是适度有效的。
Zordeche的答案概念的一点certificate(与Ubuntu):
$ sudo apt-get install hping3 $ sudo hping3 -1 --spoof 11.10.10.20 www.google.com HPING www.google.com (eth0 64.233.169.105): icmp mode set, 28 headers + 0 data bytes
然后在另一个控制台:
$ sudo tcpdump -i eth0 'icmp' tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 13:30:19.439737 IP 11.10.10.20 > yo-in-f105.1e100.net: ICMP echo request, id 31297, seq 0, length 8
所以是的,微不足道的,但是你没有得到前面提到的答复,除非你有机会访问11.10.10.20,或者在www.google.com和11.10.10.20之间有一个嗅探器(而且它需要在前面因为你不能预测数据包的路由)。 而且,欺骗者的网关(ISP)可能不会让这个数据包出门,如果他们进行某种types的IP检查,并且看到源头味道不好。
IP地址很容易伪造为单向UDPstream量。 对于TCP数据包,只能伪造成与SYN数据包打开半开TCP连接。 这也是一种DOS攻击的基础。 但是,您无法伪造具有欺骗地址的HTTP连接(例如,如果您正在过滤会话以使用相同的IP地址)。 虽然是的,你可以在数据包中伪造一个IP地址,但这只对某些types的拒绝服务攻击有用。
这篇GOOG文章明确地讨论了DNS。 DNS同时使用UDP和TCP数据包。 UDP的可以伪造,但不是TCP。 TCP需要3次握手 。 如果TCP数据包的IP地址是伪造的,那么锻造计算机将不会收到响应,连接将失败。 正如其他答案中所提到的,UDP是“消失而忘记”的,并且不需要响应通信。 由于这个原因,DoS攻击几乎完全以UDP数据包的forms出现。
在Stack Overflow和家庭网站的情况下,Takaun Daikon提出的问题是非常有效的。 有很多方法可以从一个ISP获得一个新的IP地址。 更改MAC地址显然是最简单的,适用于许多ISP。 另外,很多有愚蠢感的人可能会使用公共代理或TOR。 明确阻止这些数据包的始发IP只会阻塞代理或TOR终止节点。
那么阻止IP地址有效? 地狱是的。 但是你会以错误结束。 您将阻止一些真正不是问题根源的IP(即代理),您也将通过更改IP来避免您的阻止。 之后不幸得到禁止的IP的人将无法访问SO家族的网站。 但错误率应该很小。 除非你阻止了大量的IP地址。 但是,如果你每天阻止一两个,你应该没问题。
你可能想要引入一个稍微复杂一点的scheme,但是只能在一段时间,比如一年。 如果您的networking能够进行带宽限制或连接限制,那么您也可以考虑一个scheme,在您的网站上运行Apache Benchmarks的冲洗包只能放在带宽非常有限的笼子里。
IP欺骗将继续,因为ISP懒惰。
我的ISP非常知道我在一个特定的地址,或者至less是我所在的子网。 但我可以使用任何源地址。 这是为什么? 简单来说,成本。
如果我在这里和那里伪造几个地址,那么我的ISP就不会花费任何东西。 如果我的ISP的每个用户在1点到2点之间伪造了一个数据包,那么这个数据包在雷达上几乎不会有什么问题。 但是,当僵尸networking从许多ISP的许多主机发送很多欺骗数据包时,目标机器或networking就会崩溃。
财务现实是,除非你是受到攻击的人,否则欺骗行为不会花费任何代价。 在客户附近实施过滤需要花费金钱,除了知道他们是好的networking公民之外,花钱的人实现很less的回报。
UDP和ICMP最容易伪造,但TCP也是可能的。 它需要一个不安全的远程操作系统,它使用可预测的序列号来利用。 有时候,负载均衡机器会改变序列号并使其可预测。 所以,TCP是可能的 – 但更难。
DNS反欺骗主要集中在防止某人向recursionparsing器提交错误答案的安全方面。 除了一个小的查询(比如'。'),UDP的泛洪方面不是DNS特定的,会导致相当大的响应。 因此,它是一个很好的放大vector。 还有很多其他的UDP协议可以工作,但是DNS在任何地方都在使用,并且很容易find用于放大攻击的机器。
DNSSEC使这种情况更加严重,UDP数据包的大小可达4k。
就基于DNS的(D)DOS攻击而言,IP地址对于伪造来说是微不足道的,因为它们通常是一个“即丢即用”的UDP数据包。 对于HTTPstream量来说,情况并非如此,所以您需要与Web服务器位于同一本地networking(当然,完全可能,取决于您的站点托pipe的位置),还是控制中间路由器。
你可以给任何人发一封信,如果你没有在信封上写上回信地址(或者写错信),他们可以雇佣世界上所有的垃圾邮件过滤员,而不是在没有打开(处理)它。
但是,如果发件人需要响应,返回地址最好是正确的,否则必须有一个应用层机制来获取正确的地址。 所以我可以让你觉得你打开了娜娜的一封信,但是即使我用信的内容骗你,你也不会把娜娜寄给在奈及利亚的某个地址的支票(除非娜娜是尼日利亚人)。 所以挑战/反应是一个有效的防守,只要你不是中间人。
我可以在数据报中设置任何我想要的源IP地址。
我的互联网服务提供商是否会让这样一个数据包暴露出来是另一个问题。
虽然这当然是一个需要处理的现实,但根本的问题实际上是非技术性的:有恶意的人试图做恶意的事情。 因此,真正的解决scheme也必须是非技术性的。
我认为Stackoverflow所做的完全是处理第二道防线的正确解决scheme:通过限制他们与平台互动的不同方式来限制潜在的垃圾邮件用户,从而达到某种“可信度”水平。
这些技术不仅可以帮助提高网站的整体质量,而且可以激励用户更多地参与进来,并提供更可信的可靠答案。
从技术的angular度来看,要做的最好的事情就是Google的build议:只要有效地吸收/处理额外的负载。
伟大的工作,并不断完善!
UDP是为什么这很容易的主要部分 – 事实上,Skype和Slingbox利用在UDP中轻松伪造IP地址的能力,通过NAT“ 冲 ”,并允许轻松的点对点。
TCP比较难,因为它需要一个完整的SYN / ACK周期,但是你仍然可以用挂起的SYN数据包来洪泛服务器,这个SYN数据包跳到IP地址很多跳,而且在这个过程中本质上捆绑了大量的路由器。
如上所述,使用代理是微不足道的,并且有大量可用的开放式匿名代理。
即使没有使用代理服务器,我也可以将防火墙上的MAC地址设置为任意新的值,重置电缆调制解调器,ISP将为我指定一个全新的shinyIP地址。
这仅仅是为了初学者。 有许多其他的方式来解决IP禁令。
如果是这样,可能有哪些缓解措施?
在接收方面你可以做的不多。
伪造者的ISP应该过滤出站stream量,以便其客户不能欺骗来自不同networking的IP。
这只是在路由器configuration几行,所以没有这样做的好借口。
有一种方式来跟踪攻击者,但它需要你的上游提供商的合作: http ://www.cymru.com/Documents/dos-and-vip.html
正如其他人所指出的那样,UDP是非常微不足道的,TCP不是那么重要。
首选的防御,但不幸的是没有普遍部署,是出口filter。
对于运行DSL等服务的ISP,每个虚拟线路应configurationip verify unicast reverse-path
(或任何非Cisco等效),阻止任何数据包的源IP地址不在已知的路由范围内线。
我可以记得在90年代后期开始使用Visual Basic进行套接字编程,我们可以在连接上设置源IP。 我隐约记得,当我们尝试它时,netstat -an显示了实际的源IP,但是Apache日志显示了被欺骗的IP; 我认为Apache将欺骗性的IP交给perl模块,以此类推。