在目前以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攻击是一种典型的拒绝服务型(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是对TCP服务器端的三次握手协议作一些修改,专门用来防范SYN Flood攻击的一种手段。它的原理是,在TCP服务器收到TCP SYN包并返回TCP SYN+ACK包时,不分配一个专门的数据区,而是根据这个SYN包计算出一个cookie值。在收到TCP ACK包时,TCP服务器在根据那个cookie值检查这个TCP ACK包的合法性。如果合法,再分配专门的数据区进行处理未来的TCP连接。

从上面的介绍可以看出,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 << COOKIEBITS) - 1)

COOKIEBITS表示cookie的比特长度;COOKIEMASK是一个COOKIEBITS长的比特串,所有比特都是1。

还有两个比特串,被定义成一个__u32的二维数组

static __u32syncookie_secret[2][16-3+HASH_BUFFER_SIZE];

其中所有的比特值在secure_tcp_syn_cookie中被随机的赋予,用get_random_bytes函数。它们成为制作cookie的密钥。这两个被随机产生的比特串是整个SYN Cookie实现方案的关键。另外还有一个开关syncookie_init控制对这两个密钥的改动。

还需要指出,在文件syncookies.c中定义有一个__u16组成的表static __u16 const msstab[],这个表中保存的是一些可能的MSS(Maximum Segment Size)值。

secure_tcp_syn_cookie函数的返回值就是计算得到的ISN值,即cookie。为了描述方便,我们给出如下定义:

tmp1 := saddr + daddr + ((sport<<16)+dport) + syncookie_secret[0]

tmp2 := saddr + daddr + ((sport<<16)+dport) + syncookie_secret[1]

tmp11 := HASH_TRANSFORM(tmp1[16], tmp1)

tmp22 := HASH_TRANSFORM(tmp2[16], tmp2)

A := tmp11[0][17]

B := tmp22[1][17]

sseq := ntohl(skb->h.th->seq) 这里的skb是携带TCP SYN的那个skb

count1 := jiffies/(HZ*60) 当前时间的分钟值

data1 := msstab

从前往后最后一个小于skb中携带的MSS值的值的索引(值得注意的是两个密钥在第一次被初始化后,就不会再有改动,直到系统重新启动。因此可以认为它是一个常值。)

有了上面的定义我们可以得到cookie等于

isn := A+sseq + (count1<

这个isn被赋予返回的TCP SYN+ACK包中,作为其中的ISN值。这就是cookie 的产生过程。在这个过程中,没有在本地为这个连接请求分配任何存储空间。

在TCP服务器收到TCP ACK包时,相应的要进行SYN Cookie的检查。这个检查过程在函数tcp_v4_hnd_req中的cookie_v4_check函数开始。cookie_v4_check调用cookie_check函数,cookie_check函数调用check_tcp_syn_cookie函数。

check_tcp_syn_cookie函数在random.c中定义,是与前面介绍的

secure_tcp_syn_cookie函数对应的函数,检查从TCP ACK中提取出的ISN值。

在check_tcp_syn_cookie中假定ISN的值如下

isn := A+sseq + (count2<

这里的A、B都是根据当前这个skb中的地址信息和syncookie_secret算出来的;sseq是根据这个skb中的seq值算出的。

有了上面这些值,TCP服务器就可以反算出count2和data2。理论上来说,只要这个isn是原来那个isn,应该有

count2 == count1

data2 == data1

但是这种结论仅仅是一个理论情况。因为在TCP服务器端并没有保存原来的count1和data1,因此不能直接进行比较。TCP服务器采取的方法是:

1)计算出当前的分钟值

count3 := jiffies/(HZ*60)

用count3与count2比较,如果差值超过COUNTER_TRIES(4)分钟,则认为这个ACK包不合法。

2)看data2是不是一个合法的msstab的索引,也就是说是不是小于NUM_MSS,即(sizeof(msstab)/sizeof(msstab[0]) - 1)。如果小于,则认为这个ACK 合法,否则认为非法。

上面介绍的就是Linux内核Linux2.4.20中对SYN Cookie的实现方式。下面讨论一下它的合理性。希望得到的结论是这种方案可以有效的实现一般TCP的连接,同时可以防止SYN Flood攻击。

从上面的介绍来说,合法的TCP连接请求一定可以通过SYN Cookie流程。另一方面我们看SYN Cookie在系统受到各种SYN Flood攻击时会采取的行为。最一般的SYN Flood攻击方式是攻击者作为TCP客户机发送大量TCP SYN包而不再发送其他的包。这时SYN Cookie会为每个SYN包计算出相应的ISN值,并返回SYN+ACK包,而在本地将不分配任何存储空间,因此不会被成功攻击。

根据SYN Cookie的原理,攻击者有可能直接发送大量ACK包。这时SYN Cookie提取出每个包的isn值,并假定它有下面的格式

isn := A+sseq + (count<

反算出count和data。

因为攻击者并不知道这里的A和B,因此经过反算出的count和data几乎不可能都合理,因此TCP服务器也几乎不可能为这些ACK包分配存储空间,这也就说明了SYN Cookie达到起到了抵挡SYN Flood攻击的作用

linux cookie 地址,SYN Cookie原理及其在Linux内核中的实现相关推荐

  1. 嵌入式Linux驱动开发 02:将驱动程序添加到内核中

    文章目录 目的 基础说明 添加到内核中 Kconfig Makefile 驱动程序 编译与测试 模块方式 编译到内核中 总结 目的 在上一篇文章 <嵌入式Linux驱动开发 01:基础开发与使用 ...

  2. linux文件管理课程设计,操作系统原理课程设计-Linux文件管理系统的仿真.doc

    操作系统原理课程设计 实践报告 全套设计加扣 3012250582 题 目: Linux文件管理系统的仿真 姓 名: 学 院: 信息科学技术学院 专 业: 计算机科学技术系 班 级: 计科121 是否 ...

  3. mac的 上传到linux服务器地址,【mac 怎么登录到 linux 服务器并传输文件?】-看准网...

    匿名用户 用 lrzsz链接:mmastrac/iterm2-zmodem用法:Install lrzsz on OSX: brew install lrzszSave the iterm2-send ...

  4. linux函数嵌套,gcc内嵌函数__builtin_types_compatible_p 在内核中的一个实例...

    在include/linux/kernel.h中有一个定义: #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_a ...

  5. ORACLE11g R2 for Linux 下载地址

    ORACLE11g R2 for Linux 下载地址 http://download.oracle.com/otn/linux/oracle11g/R2/linux_11gR2_database_1 ...

  6. 海量数据去重,hash、布隆过滤器以及hyperloglog丨c/c++linux服务器开发丨后端开发丨Linux后台开发丨底层原理

    海量数据去重,hash.布隆过滤器以及hyperloglog 视频讲解如下,点击观看: 海量数据去重,hash.布隆过滤器以及hyperloglog丨c/c++linux服务器开发丨后端开发丨Linu ...

  7. KSM(Kernel Samepage Merging) 剖析:Linux 内核中的内存去耦合

    简介:作为一个系统管理程序(hypervisor),Linux® 有几个创新,2.6.32 内核中一个有趣的变化是 KSM(Kernel Samepage Merging)  允许这个系统管理程序通过 ...

  8. linux drcom 内网 外网,drcom 在linux下的配置

    首先我需要说明一下: drcom-1.4.4 (for kernel >=2.6.24) 2008-04-12 04:26 drcom-1.3.7.tar 2007-09-07 23:15 明白 ...

  9. mini2440 linux移植开发实战指南,Linux-2.6.32.2内核在mini2440上的移植---移植SD卡驱动...

    移植环境(红色粗字体字为修改后内容,蓝色粗体字为特别注意内容) 1,主机环境:VMare下CentOS 5.5 ,1G内存. 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linu ...

最新文章

  1. MOSS 2010:Visual Studio 2010开发体验(26)——工作流开发概述
  2. 边缘检测robert原理_机器视觉边缘模式检测应用
  3. bvp解算器是什么_那些学习了编程的中学生,为什么会更可能成功?
  4. 18.外部相机校准——旋转(Rotation),R是什么样子的,绕Z轴旋转的例子,齐次坐标旋转_2
  5. 简单选择排序_Python3三种简单排序(冒泡、插入、选择)的比较
  6. aws rds监控慢sql_使用AWS Database迁移服务进行AWS RDS SQL Server迁移
  7. postgresql 9.1 下的 pg_dump 的初步研究
  8. Python中用pandas将numpy中的数组数据保存到csv文件
  9. 【Oracle学习笔记】索引
  10. CMU 15-213 Introduction to Computer Systems学习笔记(2) Bits,Bytes,Integer
  11. 数据挖掘学习之路一:数据挖掘认识
  12. css 彩虹色渐变色,纯CSS实现颜色渐变效果(包含环形渐变、线性渐变、彩虹效果等)...
  13. 2022年新版青龙面板对接企业微信应用实现定时推送日志
  14. Jenkins+GitLab+Docker持续集成LNMP
  15. mysql 1032 1062_mysql slave频繁报1032_1062错误
  16. 如何通过OAuth2.0认证方式建立ServiceNow与Salesforce通信
  17. 祝福大家劳动节节日快乐
  18. GDOC CEO Musk Shing出席“链接未来”区块链全球人才交流会
  19. 大浪淘金——下半年经济与资本市场展望(姜超6月25日于海通深圳策略会)
  20. 数字经济时代的网络安全发展形势分析与趋势展望

热门文章

  1. Spring4有条件
  2. Spring MVC:MySQL和Hibernate的安全性
  3. 通过命令行界面使用AWS ElasticMapReduce
  4. 终极JPA查询和技巧列表–第3部分
  5. 执行Plugins下的install:install报错:The packaging for this project did not assign a file to the build artif
  6. Java的访问控制修饰符_访问权限修饰符_访问权限修饰词
  7. 【开源项目】基于QT录制PCM音频实例详细
  8. 异质性查询需要为连线设定_振奋人心!华东理工大学开发新型的荧光染料,为细胞成像奠定基础...
  9. 一文掌握 C 智能指针的使用
  10. Python3实现翻转二叉树问题