转自:
http://www.ibm.com/developerwork ... cn-newsletter-linux域名
SY.N Cookie原理.及其在Linux内核中的实现.
本文就分别介绍一.下 SYN Flood 攻击和 SY.N Cookie 的原理,更重要的是介绍. Linux 内核中实现SYN Cookie 的方式。最后,本文给出一种增强目前 Linux 中 SYN Cookie 功能的想法。电影
概述
在目前以IPv4为支撑的网络协议上搭建的网络环境中,SYN Flood..是一种.非常危险而常见的DoS攻击方式。到目前为止,能够有效防范SYN Flood攻击的手段并不多,而SYN Cookie就是其中最著名的一种。SYN Cookie原理由D. .J. Bernstain和 Er.ic 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连接,它需要首先发送T.CP SYN 包到对方,对方收到后发送一个TCP SYN+ACK包回来,发起方再发送TC.P 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. Fl.ood攻击的一.种手段。它的原理是,在TCP服务器收到TCP SYN包并返回TCP SYN+ACK包时,不分配一个专门的数据区,而是根据这个SYN包计算出一个cookie值。在收到TCP ACK包时,TCP服务器在根据那个cookie值检查这个TCP ACK包的合法性。如果.合法,再分配专门的数据区进行处理未来的TCP连.接。.
从上面的介绍可以看出,.SYN C.ookie的原理比较简单。到实际的应用中,它有多种不同的实现方式。.
三、Linux内核中的SYN Cookie实现.健康
Linux 内核中对SYN Flood有很好的防护。以下的讨论都是针对Li.nux2.4..20内核进行的。在每一个sock都有一个tcp_opt即这个sock的TCP选项。在. tcp_opt其中有一个tcp_listen_opt,这里存储的是这个sock在LISTEN状态下时保存的一些选项,其中有一个 open_request结构的数组,数组长度为TCP_SYNQ_HSIZE(512)。所有这些.表示在一个sock,最多可以同时开启512个半开连 接(这是在不考虑其他约束条件时的最大值,实际情况中不会达到这个值)。当这个数组满了时,新来的open_reques.t会顶替掉一个老的 open_request。这样,.即使没有启动SYN Cookie.,也能够在SYN Flood发生时保护系统免于瘫痪。问题是这种处理方法会在面对SYN Fl.ood攻击时丢掉正常的TCP连接请求。SYN Cookie的.作用恰恰是保证在面对SYN Flood攻击时,一方面能够拒绝非法的TCP连接请求,一方面正常连接可以被建立.。 汽车
Linux 内核对TCP流程的处.理主要在tcp_ipv4.c文件中的函数实现。具体的,当处理TCP SYN包时,系统进入tcp_v4_conn_request函数。其中调用c.ookie_v4_init_sequence.生成一个 ISN(Initial Seq.uence Number)。Linux内核把它作为SYN Cookie流程中的cookie。.
cookie_v4_in.it_s.equence函数在syncookies.c文件中定义,它又调.用random.c文件中的secure_tcp_syn_cookie函数。cookie的实质计算是在这个函数中进行的。.
在random..c文件.里给出secure_tcp_syn_cookie函数的定义之前给出两个宏,它们的定义分别为投资
#define COOKIEB.ITS 24服务器
#define COOKIEMASK (((.__u3.2)1 << COOKIEBITS) - 1)服务器
COOKIEBITS.表示co.okie的比特长度;COOKIEMASK是一个COOKIEBITS长的比特 串,所有比特都是1。.
还有两.个比特串,被定义成一个__u32的二维数组.
static _.._u32 syncookie_secret[2][16-3+HASH_BUFFER_SIZE];学习
其中所有的比特值在secure_tcp_syn_cookie中被随机的赋予,用get_random_bytes函数。它们成为制.作cookie的密 钥。这两个被随机产生的比特串是整个SYN. C.ookie实现方案的关键。另外还有一个开关syncookie_.init控制对这两个密钥的改动。( 游戏 )
还需要指出,在文件syncookies.c中定义有一个__u16组成的表static __u16 const msstab[.],这个表中保存的.是一些可能的MSS.(Maximum Segment Size)值。.
secure_tcp_sy.n_co.okie函数的返回值就是计算得到的ISN值,即cookie。为了描述方便,我们给出如下定义:电脑
. tmp1 := saddr + daddr + ((sport<.<16)+dport) + syncookie_secret[0](广告)
tm.p2 := saddr + daddr + ((.sport<<16)+dport) + syncookie_secret[1] 婚庆
tmp.11 := HASH_TRANSFORM(tmp1[16]., tmp1).
t.mp22 := HASH_TRANSFORM(tmp2[16],. tmp2)(广告)
A := tmp.11[0][17] 杀毒
B := t.mp22[1][17] 电子
sseq := ntohl(skb->h.th.->seq) .这里的skb是携带TCP SYN的那个skb --------------彩票
count1 := j.iffies/(HZ*60) 当前时.间的分钟值 .
data1 := msstab. 投资
从前往后最后一个小于skb中携.带的MSS值的值的索引(值得注意的是两个密.钥在第一次被初始化后,就不会再有改动,直到系统重新启.动。因此可以认为它是一个常值。) .
有了上面的定义我们可以得到cookie.等于.
isn := A+sseq + .(c.ount1<<COOKIEBITS) + (B+data1)&COOKIEMASK 美容
这个isn被赋.予返回的T.CP SYN+ACK包中,作为其中的ISN值。这就是cookie 的产生过程。在这个过程.中,没有在本地为这个连接请求分配任何存储空间。 建材
在TCP服务器收到TCP ACK包时,相应的要进行SYN Coo.kie的检查。这个检查 过程在函数tcp._v4_hnd_req中的cookie_v4_check函数开始。cookie_v4_.check调用cookie_check函数,cookie_check函数调用check_tcp._syn_cookie函数。.
chec.k_tcp_syn_cookie函数在random..c中定义,是与前面介绍的 服务器
secure_tc.p_syn_cookie函数对应的函.数,检查从TCP ACK中提取出的ISN值。 电子
在check_tc.p_s.yn_cookie中假定ISN的值如下域名
isn := A+sseq + (coun.t2<<COOKIEBITS). + (B+data2)&COOKIEMASK.
这里的A、B都是根据当前这个s.kb中的地址信息和.syncookie_secret算出来的;sseq是根据这个skb中的seq值算出的。 鲜花
有了上面这些值,TCP服务器就可以反算出count2和data2。理论上来说,只要这个isn.是原来那个is.n,应该有 乙肝
count2. == count1 ( 游戏 )
data2 == data1
但是这.种结论仅仅是一个理论情况。因为在TCP服务器端并没有保存原来的count1和d.ata1,因此不能直接进行比较。TCP服务器采取的方法是:.
1)计算出当前的分钟值
count3 := .jiffi.es/(HZ*60) <性病>
用.count3与count2比较,如果差值超过CO.UNTER_TRIES(4)分钟,则认为这 个ACK包不合法。 外贸
2)看data2是不是一个合法的msstab的索引,也就是说是不是小于NUM_MSS., 即(sizeof.(msst.ab)/sizeof(msstab[0]) - 1)。如果小于,则认为这个ACK 合法,否则认为非法。 <性病>
上面介绍的就是Linux内.核Linux2.4.2.0.中对SYN Cookie的实现方式。下面讨论一下它的合理性。希望得到的结论是这种方案可以有效的实现一般TCP的连接,同时可以防止SYN Flood攻击。.
从上面的介绍来说,合法的T.CP连接请求一定可以通过SYN Cookie流程。 另一方面我们看SYN Cookie在系统.受到各种SYN Flood攻击时会采取的行为。 最一般的SYN Flo.od攻击方式是攻击者作为TCP客户机发送大量TCP SYN包而不再发送其他的包。这时SYN Cookie会为每个SYN包计算出相应的ISN值,并返回SYN+ACK包.,而在本地将不分配任何存储空间,因此不会被.成功攻击。虚拟主机
根据S.YN Cookie的原理,攻击者有可能直接发送大量ACK包。这时SYN Cookie提取出每个包的isn值,并假定它.有下面的格式 外汇
. isn := A+sseq + (c.ount<<COOKIEBITS) + (B+data)&COOKIEMASK.
反算出count和data。
因为攻击者并.不知道这里的.A和B,因此经过反算出的count和data几乎不可能都合理,因此TCP服务器也几乎不可能为这些ACK包分配存储空间,这也就说明了SYN Cookie达到起到了抵挡SYN Fl.ood攻击的作用。( 游戏 )
四、SYN Cookie Fir.ewall健康
从上面的介绍可以看到,Linux内核中的SYN Cookie机制主要的功能是防止本机遭受SYN Floo.d攻击的,但是在很多情况下,仅仅实现这样的SYN Cookie机制是不.够的。如果我们要考虑的是一个网关模式的防火墙,它不仅要..保护本机免受各种网络攻击,还要保护.它后面的所有对外有开放TC.P端口的主 机免受这些攻击。比如一个局域网中有个服务器开放了FTP服务给外界,这个服务器主机就有可能遭受到来自互联网上的SYN Flood攻击。而这时的防火墙会将所有的攻击SYN包转发给受害主机。<性病>
一种杜绝这种情.况的方法是SYN Cookie Firewal.l。它是SYN Cookie的一种扩展形式。总的来.说,它是利用原来SYN Cookie的原理在内网和外网之间实现TCP三次握手过程的代理(proxy)的机制。.
为了方便描述,.我们假定一个外在的TCP客户机C希望通过防火墙F连接到局域网中的.一个TCP服务器S。.
在 防火墙收到来自外网的SYN包时,它并不直接进行转发,而是缓存在本地,再按照原来SYN Cookie的机制制作好一个针对这个SYN包的SYN+ACK包,注意,这个SYN+ACK包中的ac.k顺序号为特制的cookie值c,更重要的是这 个包的的源地址被伪造成了S的地址(为了.描述方便,我们这里暂时不考虑NAT等其他因素)。这样C会接收到这个SYN+ACK包,并认为是从S反馈回来 的。于是C再响应一个ACK包,并认为与S的TCP连接已经建立起来。这时防火墙F收到这个ACK包,按照前面的描述的SYN Cookie原理来检查这个ACK中的ack顺序号。如果认为合法,F将本地缓存的来自C的SYN包发送给S,这时S会响应一个SYN+ACK包到C,其 中也携带一个seq号, 我们..设为c`。当然这个包不会到达C,而是由防火墙F截取,F根据这个包中的序列.号等信息,造一个ACK包响应到S。这时的情况是:C认为自己已经与S建 立了TCP.连接;S认为自己与C建立了TCP.连接。以后的TCP数据内容可以.直接.穿过防火墙.F,在S和C之间交互。域名
(图见附件)
上图是SYN Cookie Fire.wall.的工作原理,它相当于在T.CP Server与TCP Client之间实现了对三次握手协议的代理。第一次"三次握手"在TCP Client与防火墙之间进行,第二次"三次握手"在防火墙与TCP Server之间。在第一次"三次握手"时使用前面介绍的SY.N Cookie流程。有一个问题在进行两次"三次握手"时.出现了:如图所示,进行第一次"三次握手"后,TCP Client认为后续数据包的seq值从c+1开始,而进行第二次"三次握手."后,TCP Server认为后续发来的数据包的seq值从c`+1开始, c是cookie.,c`是TCP Server随机产生的。c和c`几乎不可能相等,也就是说在完成上面的两个"三次握.手"后,如果不进行其他.操作,后续从TCP Client到TCP Server的数据包都将被认为顺序号不对而被丢掉。一种补救方法就是在防火墙本地保存一个值δ .
δ = |c - c`|
利用这个差值,在每.个数据包经过防火墙时,将其seq值修改一下,这样,后.续的.数据流量可以完美地在TCP Server和TCP Client之间传输了。 女人
总结
现在普遍使用的IPv4协议带有很多安全上的问题,其中面对SYN Flood攻击的软弱就是一点。在不改变TCP三次握手流程的情况下,TCP Ser.ver几乎不可能有效的防范SYN Flood的攻击。要保证完全.防范SYN Flood,必须修改三次握手协议。SYN Cookie是.一种很有效的方法。它的思想比较简单,主要是如何具体的实现,Linux系统也提供了一种实现。作者通过研读Linux2.4.20内核中 的代码,基本了解了Linux内核中实现SYN Cook.ie的手段,将其总结成文字,与对SYN C.ookie同样感兴趣.的朋友分享、交流。教育
关于作者
魏晋伟,通过
weijinwei@yaho.o.com.cn可以跟.他联系。 婚庆
image0.02.gif (7.69 KB) (广告)
下载次数:0
2009-12.-15 09:52.
http://upload.bbs.csuboy.com/Mon_1004/126_7079_10b638f035c1ea6.gif[/img].
http://upload.bbs.csuboy.com/Mon_1004/126_7079_9ccf6db1b2643e1.gif[/img]SYN Cookie原理及其在Linux内核中的实现.pdf (176.68 KB) 下载次数:1 乙肝
2009-12.-15 09:52<性病>
1
评分人数http://upload.bbs.csuboy.com/Mon_1004/126_7079_c2515fb4e40125e.gif[/img]platinum: 感谢转载可用积分 + 5 .
N.ovell Linux迁移有奖大调查!| 顶级.linux与嵌入式,50000年薪起 | 《开源时代》2010年第三期! |. 2010数据库技术大会报名啦 --------------彩票
http://upload.bbs.csuboy.com/Mon_1004/126_7079_bfdda8423514cf8.gif[/img]platinum (何时才能飞) 电脑
人生的转折
发短消息
加为好友
platinum (何时才能飞)当前离线 ..
人生的转折
UID1728743 帖子35237 精华24 积分50888 可用积分50888 信誉积分105 专家积分599 空间积分0 阅读权限100 在线时间730 小时 注册时间2002-11-02 最后登录2010-04-10 http://upload.bbs.csuboy.com/Mon_1004/126_7079_9a1618ef2bf9940.gif[/img] http://upload.bbs.csuboy.com/Mon_1004/126_7079_29982dec62f3764.gif[/img] http://upload.bbs.csuboy.com/Mon_1004/126_7079_2b3a1dc222d0d36.gif[/img] 鲜花
广告杀手
http://upload.bbs.csuboy.com/Mon_1004/126_7079_10c5ed31a1803cd.gif[/img] 电子
帖子35.237 主题68.2 精华24 可用积分50888 专家积分599 在线时间730 小时 注册时.间2002-11-02 最后登录2010-04-10 状态:...保密....
[微博] [博客] [短信] http://upload.bbs.csuboy.com/Mon_1004/126_7079_3c0ffaf4b4be824.gif[/img] 2楼 发表于 2009-12-15 11:20 | 只看该作者 虚拟主机
感谢转载