一种抵御 DDoS 攻击的 IP 追踪技术

在拾掇家务时,发现一页我在 2008 年 10 月做的备忘录,记录了一个可用于抵御 DDoS 攻击的 IP 追踪技术。当时因为觉得 idea 太小,不值当写成文章投出去。纸张放那里总是占地方,在博客里电子化一下,然后就能销毁了。

Differential Deterministic Packet Marking

这个 idea 是在 IP 协议的基础上做一些扩展,可以帮助用户在 DDoS 攻击时识别攻击数据包和定位攻击者。在理解这个 idea 之前,可能需要先看几篇参考文献:

[1] Z. Gao and N. Ansari, "Tracing cyber attacks from the practical perspective, " IEEE Communications Magazine, vol. 43, no. 5, pp. 123-131, 2005.

[2] A. Belenky and N. Ansari, "On deterministic packet marking, " Computer Networks, vol. 51, no. 10, pp. 2677–2700, 2007.

[3] Y. Xiang, W, Zhou, and M. Guo, "Flexible deterministic packet marking: an iP traceback system to find the real source of attacks, " IEEE Transactions on Parallel and Distributed Systems, vol. 20, no. 4, pp. 567-580, 2009.

这个 idea 主要是在 [3] 基础上做的改进,其 motivation 是仅仅使用标记段 [3] 内容太保守,用标记段再结合 IP 头中已有的信息,可以做得更好。简单来说就是运营商的接入路由器在 IP 头中增加一些标记,服务器在遭遇到 DDoS 攻击时,可以根据接入路由器增加的标记再结合 IP 头中已有的信息,识别攻击流量,以及确认攻击源。

下文的内容基于三个假设:

  1. Source IP 和 ingress router 的接入 interface 的 IP 经常在同一个网段中;
  2. 大部分网络流是正常的网络流而非 DDoS 的网络流。
  3. ingress router 在可控域中,未被入侵。

图1: 典型网络拓扑示意图,来源于[2]
由图中可见,如果主机使用真实IP 的话,Host 1 发出数据包的 source IP 和 router interface 1 的 IP 仅在最后八位不同,Host 2 发出数据包的 IP 和 router interface 2 的IP 也是仅仅在最后八位不同。

由假设有大部分数据包的 source IP 与 router interface IP 在同一个网段中,这样 ingress router 只需在标记段中标记与 source IP 不同的位即可进行追踪。

图2: IP 头和标记段,标记段与[3]相同
在我的 idea 里,Mark 使用的是 IP 头中的 IDENTIFICATION 域,共 16 位(我们也可以用上 TOS,这样就有 19 或者 24 位),其中各个位的作用如图 3 所示:

图3: 标记段内容

入口路由器上执行的标记算法是:

Algorithm:( 16-bit Mark case, RI for Router Interface)

if (SourceAddr RIAddr ) ⊕ & 0xffff8000 = 0 // Case 1
    Mark := SourceAddr ⊕ RIAddr // 1 packet
else if (SourceAddr ⊕ RIAddr ) & 0xff000000 = 0 // Case 2
    Digest := hash(RIAddr)
    for i=0 to 2 // 3 packets
        Mark[i].M := 1
        Mark[i].A := 0
        Mark[i].seg := i
        Mark[i].digest := Digest
        Mark[i].address_diff := ((SourceAddr ⊕ RIAddr) >> (i*8)) & 0xff
else // Case 3
    Digest := hash(RIAddr)
    for i=0 to 3 // 4 packets
        Mark[i].M := 1
        Mark[i].A := 1
        Mark[i].seg := i
        Mark[i].digest := Digest
        Mark[i].address_diff := ( RIAddr >> (i*8)) & 0xff

我提出的新 idea 对 [3] 的改进能够带来以下几个好处:

  1. 大部分数据包仅靠 1 个包就可以 traceback。根据上面的假设,正常的数据包应该仅仅在 IP 地址的低位与路由器接口 IP 不同,这样仅仅需要在 mark 中的低 15 位与源 IP 异或就能得到路由器接口 IP(case 1)。
  2. 加快路由器对正常数据包的处理速度。由于正常的数据包仅需要 1 个包就能 traceback,不需要计算地址的 hash 值,大大加快了路由器对正常数据包,也是大部分数据包的处理速度。
  3. 不影响正常 IP 数据包的 fragment 策略。由于大部分正常的数据包仅仅需要一个包就能 traceback,那么修改 IDENTIFICATION 域对这些数据包的 fragment 策略毫无影响。对于非正常的数据包,本算法需要多个包才能 traceback,所以对其 fragment 策略会有影响,但由于它是非正常的数据包,不用考虑后果。

之所以觉得这个 idea 小,有两个原因:

  • 第一是在别人方案基础上做的改进,创新不够;
  • 第二是需要部署到全网(至少某个运营商内部)所有接入路由器上,(尤其在 IPv6 已增强安全性的前提下)不太可能实现。

这也符合我对很多研究的看法,虽然有意义,但在工程上基本价值不大,基本上就自己 YY 一下。

GUCAS IP 网关登录客户端 1.3 发布

如果您不知道这软件是干嘛的,那您就不用往下看了。这个软件是中科院研究生院师生使用的,更新公告发表在这里只是为了记录一下版本发布历史。

软件主页:http://share.solrex.org/casnet

最新版本 1.3-1(2009年2月11日发布) 更新

  1. 增加了单击更换登录模式功能。
  2. 增加了自动断线充连功能。
  3. 增加了余额不足提醒功能。
  4. 解决了以前版本的一些 BUG。

GUCAS IP 网关登录客户端版本1.2 发布

CASNET 是中科院内部 IP 控制网关登录客户端,支持 Linux 和 Windows 双系统。此软件完全使用 Python 语言写成,同时拥有命令行和图形界面,使用简单,安装方便,实乃中国科学院 IP 网关用户居家旅行必备之良品 :)。

CASNET 的官方主页:http://share.solrex.org/casnet

软件特性

  1. 同时支持 Linux 和 Windows 操作系统!
  2. 提供各种格式的安装包,方便安装过程。
  3. 客户端同时具有命令行和图形界面,满足不同用户需要。
  4. 可设置选项多,可保存用户设置,登录简单快捷。
  5. 纯 Python 编程,修改简单,扩展性强。
  6. 开放源代码,确保程序无后门。

最新版本 1.2-1(2008年6月7日发布) 更新

  1. 增加 Windows XP 系统支持。
  2. 解决了一些 BUG.

如何选择合适自己的安装包

if 您是 Linux 用户并且拥有 Python 和 PyGtk? 支持(一般的 Linux 发行版都有):
  if 您使用 RedHat系列的 Linux 系统(Fedora, RHEL, CentOS,...):
    请下载 casnet-1.2-1.i386.rpm
  elif 您使用 Debian 系列的 Linux 系统(Debian, Ubuntu,...):
    请下载 casnet-1.2-1_i386.deb
  else:
    请下载 casnet-1.2-1_i386.tar.gz
elif 您是 Windows 用户:
  if 您是 Python 开发者并确信您 Windows 系统里已经安装 Python 和 PyGtk:
    请下载 casnet-1.2-1_win32_Pygtk_Installed.zip
  else:
    请下载 casnet-1.2-1_win32.zip