1 什么是SYN Flood攻击

  在TCP三次握手时,服务器接收客户端的SYN请求,操作系统将为该请求分配一个TCP(Transmission Control Block),服务器返回一个SYN/ACK请求,并将处于SYN_RCVD状态(半开连接状态)。

  从以上过程可以看到,如果恶意的向某个服务器端口发送大量的SYN包,则可以使服务器打开大量的半开连接,分配TCB,从而消耗大量的服务器资源,同时也使得正常的连接请求无法被相应。而攻击发起方的资源消耗相比较可忽略不计。

  SYN Flood是当前最流行的DoS(拒绝服务攻击)与DDoS(分布式拒绝服务攻击)的方式之一。

2 怎样发现自己处于被攻击状态

  (1)服务端无法提供正常的TCP服务。连接请求被拒绝或超时;

  (2)通过 netstat -an 命令检查系统,发现有大量的SYN_RECV连接状态。  

3 防御措施

  (1)使用TCP Wrapper,服务端只处理有限来源IP的TCP连接请求,其它未指定来源的连接请求一概拒绝。

  (2)缩短SYN Timeout时间,由于SYN Flood攻击的效果取决于服务器上保持的SYN半连接数,这个值=SYN攻击的频度 x  SYN Timeout,所以通过缩短从接收到SYN报文到确定这个报文无效并丢弃改连接的时间,例如设置为20秒以下(过低的SYN Timeout设置可能会影响客户的正常访问),可以成倍的降低服务器的负荷。

  (3)设置SYN Cookie,就是给每一个请求连接的IP地址分配一个Cookie,如果短时间内连续受到某个IP的重复SYN报文,就认定是受到了攻击,以后从这个IP地址来的包会被一概丢弃。

  (4)使用SYN Proxy防火墙

      Syn Cache技术和Syn Cookie技术总的来说是一种主机保护技术,需要系统的TCP/IP协议栈的支持,而目前并非所有的操作系统支持这些技术。因此很多防火墙中都提供一种 SYN代理的功能,其主要原理是对试图穿越的SYN请求进行验证后才放行,下图描述了这种过程:

从上图(左图)中可以看出,防火墙在确认了连接的有效性后,才向内部的服务器(Listener)发起SYN请求,在右图中,所有的无效连接均无法到达内 部的服务器。而防火墙采用的验证连接有效性的方法则可以是Syn Cookie或Syn Flood等其他技术。
采用这种方式进行防范需要注意的一点就是防火墙需要对整个有效连接的过程发生的数据包进行代理,如下图所示:

因为防火墙代替发出的SYN ACK包中使用的序列号为c,而服务器真正的回应包中序列号为c’,这其中有一个差值|c-c’|,在每个相关数据报文经过防火墙的时候进行序列号的修改。

最新文章

  1. 操作数数据类型 ntext 对于 max 运算符无效
  2. AJAX总结
  3. angularjs定义全局变量
  4. 利用反射,泛型,静态方法快速获取表单值到Model
  5. 使用VIRTUALBOX安装ANDROID系统 | 图文教程 | 相关设置
  6. C 几种异常机制简单讲述
  7. javascript中继承(二)-----借用构造函数继承的个人理解
  8. 如何在Android studio中同时打开多个工程? (转载)
  9. 定位相关-CLLocationManager的使用。
  10. HttpContext.Current.Cache 和 HttpRuntime.Cache 区别
  11. y combinator 做的一个调查_可以学习一下
  12. 相似文档查找算法之 simHash 简介及其 java 实现 - leejun_2005的个人页面 - 开源中国社区
  13. COCOS2D-JS入门-web端项目部署
  14. 判断Android应用是否安装、运行
  15. Python并发编程之从生成器使用入门协程(七)
  16. macOS实现视频转音频以及音频拼接
  17. java开发环境配置——Maven
  18. Selenium 3 学习小结
  19. 力扣(LeetCode) 263. 丑数
  20. pyqt信号和槽传递额外参数

热门文章

  1. LINQ的Union方法
  2. sql 内连接和外链接
  3. 利用Abot爬虫和visjs 呈现漫威宇宙
  4. C#中考虑为大对象使用弱引用
  5. Eclipse导入Java项目时“No projects are found to import”错误的处理
  6. FreeBSD pkg仓库有台湾的镜像了
  7. IOS 集成第三方登录
  8. Intellij Idea上传本地项目到Git
  9. Java --HashMap源码解析
  10. PHP Redis 全部操作方法