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