我是一名本科计算机科学专业的学生,希望了解一些防止 IP 欺骗的方法,但我尝试过的所有资源都以理论的方式阐述了这一概念。我想尝试以下技术之一:
http://en.wikipedia.org/wiki/Port_knocking
http://en.wikipedia.org/wiki/SYN_cookies
我如何在自己的系统中模拟整个情况,如果我自己是攻击者,我必须自己防御?一旦我理解了它,我该如何开始将其转化为编程术语?
答案1
您需要做的第一件事是了解要防范的攻击类型。我认为没有什么比编写代码来执行攻击更能让您更好地了解攻击。
我所知道的与 IP 欺骗有关的三类攻击如下:
- 服务器上的资源消耗
- 反射攻击
- 对问责的攻击
我将更详细地描述每种攻击。资源消耗类攻击意味着服务器将收到大量数据包,其中大多数数据包都带有伪造的源 IP。由于伪造的 IP 地址可以有攻击者选择的任何分布,因此无法区分伪造数据包和合法数据包。服务器只有资源来处理一定数量的数据包,攻击者发送的数据包越多,服务器可以处理的合法数据包的比例就越小。
此类攻击的典型代表是 SYN 洪水攻击,这种攻击在几十年前就已经出现。它在服务器上消耗的资源主要是内存,用于保存每个 TCP 连接的状态。
SYN cookies 的设计目的就是为了防止这种攻击。它们采用了 cookie 的概念,并将其融入 TCP 握手中。cookie 是服务器发送给客户端的短值,其唯一目的是让客户端可以将其发送回服务器。这证明客户端收到了 cookie。通常的欺骗场景只允许攻击者从欺骗的 IP 发送数据包,而不会接收服务器发送到此 IP 的数据包。
SYN cookies 确实失去了 TCP 的一些功能。这是因为需要与现有的 TCP 客户端兼容,同时在客户端通过返回 cookie 证明 IP 地址之前不使用服务器上的内存。
端口敲击无法实现上述两个设计目标。它对客户端来说根本不透明。此外,它还要求在第一个(敲击)数据包发送到服务器后仍存储状态。端口敲击根本不是为了缓解 IP 欺骗而设计的,它是为了完全不同的目的而设计的。如果您确实想要有效防范 IP 欺骗,并且愿意要求客户端进行软件更新,那么还有更有效的方法。
反射攻击的目的是消耗网络带宽,而不是服务器本身的资源。此类攻击将受害者的 IP 放入源 IP,将任何合适的服务器放入目标 IP。一旦服务器收到请求,它就会用一个可能比请求大得多的回复来回复欺骗源。这使得攻击者能够向受害者发送比其自身发送的流量大得多的流量。
此类攻击可使用多种基于 UDP 的服务。DNS 和 NTP 是众所周知的服务,当收到较小的请求时,可能会发送较大的回复。
防范反射攻击的最有效方法是,服务器永远不要发送超过一个数据包来响应来自 IP 地址的请求(该请求之前未经证实正确),并且该响应所包含的字节数不得超过请求的字节数。TCP 通常被认为不受反射攻击的影响,但基于 UDP 的服务可能容易受到攻击。
第三类攻击是在整个通信过程中使用一个欺骗性 IP 在服务器上完成整个交易。服务器上的所有日志都会表明此交易是由欺骗性 IP 执行的。这通常被认为是纯理论攻击。
通常,通信(这非常重要)是通过 TCP 进行的。攻击者必须猜测一个 32 位序列号才能建立连接。攻击者可能还必须猜测服务器每个回复的大小。如果使用加密,攻击者甚至可能必须猜测部分内容。此外,攻击者必须在被欺骗的主机有时间向服务器发送错误消息(这将关闭连接)之前完成交易。
如何测试攻击
设置一个小型的机器网络,很容易就可以伪造 Internet 上任何主机的 IP 并将数据包从该 IP 发送到您自己的服务器。同时,您可以安排路由表将回复路由到 Internet。通过这种设置,您有一个真实的网络来测试 IP 伪造。请记住,只伪造不允许通过 BGP 公布的 IP 地址,这样您就不会给反射数据包的某人带来麻烦。
一旦设置完成,普通的 TCP 或 DNS 客户端就足以向服务器发送欺骗数据包。实际的洪水攻击需要更多努力才能设置,但并不难。
如何保护 DNS 免遭欺骗
首先,如果你有 DNS 服务器,你可以检测到它正在被反射攻击。反射攻击会导致服务器在向欺骗 IP 发送回复后收到 ICMP 错误。
您可以采取哪些措施来缓解攻击?首先,您可以跟踪已证实的客户端 IP 地址和欺骗的 IP 地址。显然,大多数 IP 地址都属于未知类别。当您收到对 DNS 回复的 ICMP 错误响应时,该 IP 地址将被归入欺骗 IP 地址类别。当 IP 进入该类别时,必须实施缓解措施。
为了缓解攻击,DNS 服务器发送的回复仅包含请求,但不包含实际回复。此外截断位必须设置。这将告诉客户端使用 TCP 重试请求。通过 TCP 的成功请求将证明 IP 是实际客户端的 IP,并将 IP 地址移动到已验证的 IP 地址集。
如果已知的欺骗性 IP 地址集超出了您想要跟踪的范围,您只需停止跟踪它,并切换到使用缓解措施,即使在欺骗状态未知的 IP 地址上也是如此。
如何保护所有协议免遭欺骗
为 UDP 上运行的每项服务编写特定服务代码似乎不是防止欺骗的正确方法。应该有一种独立于服务的方法来防止欺骗。
我认为你无法以完全向后兼容的方式做到这一点。但让我们假设我们可以在 IP 层和传输层之间添加一些新东西来帮助防止欺骗,让我们假设欺骗是一个足够大的问题,需要部署这种保护,那么这种保护会是什么样子呢?
我有一个基于 IPv6 扩展标头的想法来实现这一点。几个月前我起草了一些更多细节。如果您有能力在开源 IPv6 堆栈中实际实现它,那么我很乐意将我的草稿翻译成英文。