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

在目前以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攻击的作用

091009215656.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346244.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

maya中英文对比_maya中英文对照表

1File文件New Scene建立新场景Open Scene打开场景Save Scene存盘场景Save Scene As改名存盘Import导入Export All导出所有Export Selection导出选定物体View Image查看图片View Sequence浏览顺序Create Reference引入场景文件Reference Editor引入场景编辑器Project项目New建立…

linux vmcore 分析,crash分析vmcore

然后进入 /var/crash/ 找到相应的vmcore执行crash 127.0.0.1-2014-01-21-23\:36\:14/vmcore /usr/lib/debug/lib/modules/2.6.32-902.279.9.1.***.el6.x86_64/vmlinux输出如下&#xff1a;KERNEL: /usr/lib/debug/lib/modules/2.6.32-902.279.9.1.***.el6.x86_64/vmlinuxDUM…

用置换破坏您的JUnit5测试

编写JUnit测试可能是一个乏味而乏味的过程。 了解如何使用排列结合TestFactory方法和DynamicTest对象以最少的编码工作来改进测试类。 在本文中&#xff0c;我将使用Java流ORM Speedment&#xff0c;因为它包含一个现成的Permutation类&#xff0c;从而帮助我节省了开发时间。…

es6 遍历数组对象获取所有的id_ES6对象遍历Object.keys()方法

【Object.keys()】ES5 引入了Object.keys()方法&#xff0c;返回一个数组&#xff0c;成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键名var obj { foo: bar, baz: 42 };console.log(Object.keys(obj));// ["foo", "baz"]ES2017 引入了跟…

servlet异步_如何使用异步Servlet来提高性能

servlet异步这篇文章将描述一种性能优化技术&#xff0c;该技术适用于与现代Web应用程序相关的常见问题。 如今的应用程序不再只是被动地等待浏览器发起请求&#xff0c;而是希望自己开始通信。 一个典型的示例可能涉及聊天应用程序&#xff0c;拍卖行等–共同点是这样一个事实…

mysql锁机制 php_MySQL锁机制和PHP锁机制

模拟准备--如何模拟高并发访问一个脚本&#xff1a;apache安装文件的bin/ab.exe可以模拟并发量 -c 模拟多少并发量 -n 一共请求多少次 http://请求的脚本例如&#xff1a;cmd&#xff1a; apache安装路径/bin/ab.exe -c 10 -n 10 http://web.test.com/test.php【切入正题】MYSQ…

怎么安装红旗Linux5,如何用硬盘安装红旗LINUX5_0.doc

如何用硬盘安装红旗LINUX5_0如何用硬盘安装红旗LINUX5_0本文由xinbing9贡献红旗linux5.0安装教程相信大家都和我一样,在一开始知道linux的系统时充满了神秘感.习惯了windows的我们对另一种操作系统非常好奇.正是这种好奇心,我决定装linux.看看到底有什么东东.第一次装时,大略的…

企业应用程序开发框架的分类

如果您使用的是“最佳Java框架”&#xff0c;那么您很可能会迷失本文 &#xff0c;它对Java Enterprise世界中的情况进行了很好的概述。 但是&#xff0c;从我的角度来看&#xff0c;它缺少一件非常重要的事情–对上述框架进行分类。 让我们看看这个生态系统的另一个角度&…

投资最重要的事读后感_《投资最重要的事》读书笔记分享

1、学习第二层次思维。在投资的零和世界中参与竞争之前&#xff0c;你必须先问问自己是否具有处于上半部分的充分理由。要想取得超过一般投资者的成绩&#xff0c;你必须有比群体共识更加深入的思考。你具备这样的能力吗&#xff1f;是什么让你认为自己具有这样的能力&#xff…

Linux下社交平台,Linux 启动

> 1. 如启动失败请 查看[坑点概述](https://doc.fastadmin.net/wanlshop/299.html)## Linux运行IM即时通讯#### 1\. 远程连接Linux可以通过远程连接软件、VNC远程连接、Workbench或宝塔面板 > 软件商店 > 宝塔SSH终端进入SSH 终端cd命令 进入cd www/wwwroot/你的网站/…

vscode 取消拉去变基_GIT快速回忆

关于GIT和github&#xff1a;请搜索git下载安装&#xff0c;安装了git才能去github或码云(国内)观察自己上传的代码&#xff0c;github有个桌面版只是基于git的的图形工具&#xff0c;还是需要下载git。概念&#xff1a;1.提交、版本、commit&#xff0c;ID&#xff0c;差不多都…

java对象序列化去掉字段_使用序列化查找对象中的脏字段

java对象序列化去掉字段假设您正在开发一个将对象自动保存到数据库中的框架。 您需要检测两次保存之间所做的更改&#xff0c;以便仅保存已修改的字段。 如何检测脏场。 最简单的方法是遍历原始数据和当前数据&#xff0c;并分别比较每个字段。 代码如下&#xff1a; public s…

c语言中怎么定义的字符串,C语言中定义字符串的几种方式

1&#xff0c;什么是字符串&#xff1f;所谓字符串本质上就是以\0作为结尾的特殊字符数组&#xff1b;2&#xff0c;定义字符串的过程中有哪些注意点由于字符串本质上其实就是以\0作为结尾的特殊字符数组&#xff0c;所以定义字符串时&#xff0c;必须保证字符串存储的最后一个…

ios 不被遮挡 阴影_解决ios10导航栏底部阴影线条隐藏失效问题

2016.11.13 21:47* 字数 887 阅读 791评论 0喜欢 16一、置空阴影图片基于iOS9,在iOS10上不好使.[self.navigationController.navigationBar setShadowImage:[UIImage new]];二、剪裁navigationBar首先看看UIView的clipsToubounds属性在SDK中的描述&#xff1a;property(nonatom…

Java的未来项目:巴拿马,织布机,琥珀和瓦尔哈拉

新闻稿“ Oracle Code One Java主题演讲概述了Java的未来 ”在Oracle Code“突出未来项目” Valvala 项目&#xff0c;巴拿马 项目&#xff0c;Amber 项目和Loom 项目中描述了Java主旨。 这篇文章为不熟悉上述项目的人提供了每个项目的简要摘要以及与每个项目相关的一些最新工作…

c语言选择题答案在哪查,C语言选择题及答案

C语言选择题及答案成绩的取得离不开我们平时的努力&#xff0c;以下是百分网小编为大家整理的C语言选择题及答案&#xff0c;希望对大家的学习起到帮助!选择题1.在深度为5的满二叉树叶中&#xff0c;叶子结点的个数为( )。A.32B.31C.16D.152.软件生命周期中&#xff0c;花费最多…

vs2019中如何创建qt项目_在VS2015中创建Qt项目【VS+Qt项目开发系列】(二)

在VS2015中创建Qt项目【VSQt项目开发系列】(二)发布时间&#xff1a;2018-04-20 22:44,浏览次数&#xff1a;1269, 标签&#xff1a;VSQt在上一篇【VSQt项目开发】(一)在VS2015中安装Qt环境中&#xff0c;我们完成了开发环境的安装&#xff0c;现在我们正式创建我们的项目。项目…

c语言ok未定义标识符,C语言中宏的相关知识 - osc_y7ckpzr9的个人空间 - OSCHINA - 中文开源技术交流社区...

2019/04/27 16:02 1.宏的定义&#xff1a;宏定义就是预处理命令的一种&#xff0c;它允许用一个标识符来表示一个字符串。格式如下&#xff1a;#define name(宏名) stuff(字符串)本质就是使用宏名去替代字符串的内容&#xff0c;注意是原封不动的替换&#xff0c;不要自己潜意识…

pythoni屏幕连点_【Flutter组件】仿抖音双击点赞弹出爱心效果(可连点)

效果简介仿抖音点赞手势&#xff0c;单击暂停&#xff0c;双击点赞&#xff0c;可连续点击添加多个爱心&#xff0c;特点如下全部效果为代码绘制(爱心图标来自Material Icon的图标)套上在目标Widget外即可使用提供单击与点赞的回调建议复制代码使用&#xff0c;动画可按需修改没…

java8 linq4j_Java 8仍然需要LINQ吗? 还是比LINQ更好?

java8 linq4j长期以来&#xff0c; LINQ是.NET软件工程生态系统中发生的最好的事情之一。 通过在Visual Studio 2008中引入lambda表达式和monad &#xff0c;它使C&#xff03;语言跃居Java之前&#xff0c;Java在当时是版本6&#xff0c;但仍在讨论泛型类型擦除的优缺点。 这项…