Chinaunix
标题:
SYN Cookie原理及其在Linux内核中的实现
[打印本页]
作者:
bz169
时间:
2006-05-10 17:24
标题:
SYN Cookie原理及其在Linux内核中的实现
内容:
概述
一
SYN
Flood攻击
二
SYN
Cookie原理
三 Linux内核中的
SYN
Cookie实现
四
SYN
Cookie Firewall
总结
魏晋伟 (weijinwei@yahoo.com.cn)
2004 年 9 月
概述
在目前以IPv4为支撑的网络协议上搭建的网络环境中,
SYN
Flood是一种非常危险而常见的DoS攻击方式。到目前为止,能够有效防范
SYN
Flood攻击的手段并不多,而
SYN
Cookie就是其中最著名的一种。
SYN
Cookie原理由D. J. Bernstain和 Eric Schenk发明。在很多操作系统上都有各种各样的实现。其中包括Linux。本文就分别介绍一下
SYN
Flood攻击和
SYN
Cookie的原理,更重要的是介绍Linux内核中实现
SYN
Cookie的方式。最后,本文给出一种增强目前Linux中
SYN
Cookie功能的想法。
一
SYN
Flood攻击
SYN
Flood攻击是一种典型的拒绝服务型(Denial of Service)攻击。所谓拒绝服务型攻击就是通过进行攻击,使受害主机或网络不能够良好的提供服务,从而间接达到攻击的目的。
SYN
Flood攻击利用的是IPv4中TCP协议的三次握手(Three-Way Handshake)过程进行的攻击。大家知道协议规定,如果一端想向另一端发起TCP连接,它需要首先发送TCP
SYN
包到对方,对方收到后发送一个TCP SYN+ACK包回来,发起方再发送TCP ACK包回去,这样三次握手就结束了。我们把TCP连接的发起方叫作"TCP客户机(TCP Client)",TCP连接的接收方叫作"TCP服务器(TCP Server)"。值得注意的是在TCP服务器收到TCP
SYN
request包时,在发送TCP SYN+ACK包回TCP客户机前,TCP服务器要先分配好一个数据区专门服务于这个即将形成的TCP连接。一般把收到
SYN
包而还未收到ACK包时的连接状态成为半开连接(Half-open Connection)。
在最常见的
SYN
Flood攻击中,攻击者在短时间内发送大量的TCP
SYN
包给受害者,这时攻击者是TCP客户机,受害者是TCP服务器。根据上面的描述,受害者会为每个TCP
SYN
包分配一个特定的数据区,只要这些
SYN
包具有不同的源地址(这一点对于攻击者来说是很容易伪造的)。这将给TCP服务器系统造成很大的系统负担,最终导致系统不能正常工作。
二
SYN
Cookie原理
SYN
Cookie是对TCP服务器端的三次握手协议作一些修改,专门用来防范
SYN
Flood攻击的一种手段。它的原理是,在TCP服务器收到TCP
SYN
包并返回TCP SYN+ACK包时,不分配一个专门的数据区,而是根据这个
SYN
包计算出一个cookie值。在收到TCP ACK包时,TCP服务器在根据那个cookie值检查这个TCP ACK包的合法性。如果合法,再分配专门的数据区进行处理未来的TCP连接。
从上面的介绍可以看出,
SYN
Cookie的原理比较简单。到实际的应用中,它有多种不同的实现方式。
三 Linux内核中的
SYN
Cookie实现
Linux内核中对
SYN
Flood有很好的防护。以下的讨论都是针对Linux2.4.20内核进行的。在每一个sock都有一个tcp_opt即这个sock的TCP选项。在tcp_opt其中有一个tcp_listen_opt,这里存储的是这个sock在LISTEN状态下时保存的一些选项,其中有一个open_request结构的数组,数组长度为TCP_SYNQ_HSIZE(512)。所有这些表示在一个sock,最多可以同时开启512个半开连接(这是在不考虑其他约束条件时的最大值,实际情况中不会达到这个值)。当这个数组满了时,新来的open_request会顶替掉一个老的open_request。这样,即使没有启动
SYN
Cookie,也能够在
SYN
Flood发生时保护系统免于瘫痪。问题是这种处理方法会在面对
SYN
Flood攻击时丢掉正常的TCP连接请求。
SYN
Cookie的作用恰恰是保证在面对
SYN
Flood攻击时,一方面能够拒绝非法的TCP连接请求,一方面正常连接可以被建立。
Linux内核对TCP流程的处理主要在tcp_ipv4.c文件中的函数实现。具体的,当处理TCP
SYN
包时,系统进入tcp_v4_conn_request函数。其中调用cookie_v4_init_sequence生成一个ISN(Initial Sequence Number)。Linux内核把它作为
SYN
Cookie流程中的cookie。
cookie_v4_init_sequence函数在syncookies.c文件中定义,它又调用random.c文件中的secure_tcp_syn_cookie函数。cookie的实质计算是在这个函数中进行的。
在random.c文件里给出secure_tcp_syn_cookie函数的定义之前给出两个宏,它们的定义分别为
#define COOKIEBITS 24
#define COOKIEMASK (((__u32)1 ;h.th->;seq) 这里的skb是携带TCP
SYN
的那个skb
count1 := jiffies/(HZ*60) 当前时间的分钟值
data1 := msstab
从前往后最后一个小于skb中携带的MSS值的值的索引(值得注意的是两个密钥在第一次被初始化后,就不会再有改动,直到系统重新启动。因此可以认为它是一个常值。)
有了上面的定义我们可以得到cookie等于
isn := A+sseq + (count1
本文来自ChinaUnix博客,如果查看原文请点:
http://blog.chinaunix.net/u/17902/showart_110765.html
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2