`

TCP半连接和syn攻击(转)

阅读更多
文章链接来自于
http://blog.sina.com.cn/s/blog_54b5ea250100g2r8.html

SYN攻击属于DOS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。TCP协议建立连接的时候需要双方相互确认信息,来防止连接被伪造和精确控制整个数据传输过程数据完整有效。所以TCP协议采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送syn包到服务器,并进入SYN_SEND状态,等待服务器确认第二次握手:服务器收到syn包,必须确认客户的SYN 同时自己也发送一个SYN包 即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
SYN攻击利用TCP协议三次握手的原理,大量发送伪造源IP的SYN包也就是伪造第一次握手数据包,服务器每接收到一个SYN包就会为这个连接信息分配核心内存并放入半连接队列,如果短时间内接收到的SYN太多,半连接队列就会溢出,操作系统会把这个连接信息丢弃造成不能连接,当攻击的SYN包超过半连接队列的最大值时,正常的客户发送SYN数据包请求连接就会被服务器丢弃,每种操作系统半连接队列大小不一样所以抵御SYN攻击的能力也不一样。
每种操作系统都有方法来调整TCP模块的半连接队列最大数,例如Win2000操作系统在注册表
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters里 TcpMaxHalfOpen,TcpMaxHalfOpenRetried ,Linux操作系统用变量tcp_max_syn_backlog来定义半连接队列的最大数。
但是每建立一个半连接资源就会耗费系统的核心内存,操作系统的核心内存是专门提供给系统内核使用的内存不能进行虚拟内存转换是非常紧缺的资源windows2000 系统当物理内存是4g的时候 核心内存只有不到300M,系统所有核心模块都要使用核心内存所以能给半连接队列用的核心内存非常少。Windows 2003 默认安装情况下,WEB SERVER的80端口每秒钟接收5000个SYN数据包一分钟后网站就打不开了。标准SYN数据包64字节 5000个等于 5000*64 *8(换算成bit)/1024=2500K也就是 2.5M带宽 ,如此小的带宽就可以让服务器的端口瘫痪,由于攻击包的源IP是伪造的很难追查到攻击源,,所以这种攻击非常多。


------------------------------------------------------------------------------------
  tcp半开连接是指发送了tcp连接请求,等待对方应答的状态,此时连接并没有完全建立起来,双方还无法进行通信交互的状态,此时就称为半连接。由于一个完整的tcp连接需要经过三次握手才能完成,这里把三次握手之前的连接都称之为半连接(见图1)。
   为了便于理解,我们把一次完整的tcp连接比作汽车通过一座大桥,在通过大桥之前的行程都称之为tcp半开连接。tcp半开连接数就是大桥的车道,由于这个这个半连接数量如果设置过大,不仅耗费大量系统资源,而且还可能会遭受很多ddos攻击。因此,出于安全考虑,默认xp sp2(包括sp3)只允许同时存在10个tcp半开连接,也就是说这个大桥只有10个车道,破解就是通过修改tcpip.sys,拓宽这个大桥,使之拥有更多的车道,也就是增加tcp半开连接数

-------------------------------------------------------------------------------------------
深度分析“Windows2003于XP一样有半开连接数限制”
http://blog.csdn.net/kaedei/archive/2009/03/21/4011619.aspx
在讨论“半开连接”之前,我觉得最重要的一点是,必须弄清楚什么是“半开连接”。
很遗憾,在这个文章里面回复的绝大部分人,可能包括我没有看到这个之前在内,都不知道什么是“半开连接”,更加不知道微软为什么要进行限制。
所以就有诸如“2003是服务器,如果限制了基本网站就不要用了”之类可笑的观点了。


    我们先来普及一下基本常识吧,下面的文字可能有点晦涩:

    建立TCP连接的标准过程是这样的:
首先,请求端(客户端)发送一个包含SYN标志的TCP报文,SYN即同步(Synchronize),同步报文会指明客户端使用的端口以及TCP连接的初始序号;
第二步,服务器在收到客户端的SYN报文后,将返回一个SYN+ACK的报文,表示客户端的请求被接受,同时TCP序号被加一,ACK即确认(Acknowledgement)。
第三步,客户端也返回一个确认报文ACK给服务器端,同样TCP序列号被加一,到此一个TCP连接完成。
以上的连接过程在TCP协议中被称为三次握手(Three-way Handshake)。

    问题就出在TCP连接的三次握手中,
假设一个用户向服务器发送了SYN报文后突然死机或掉线,那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK报文的(第三次握手无法完成),
这种情况下服务器端一般会重试(再次发送SYN+ACK给客户端)并等待一段时间后丢弃这个未完成的连接。
这段时间的长度我们称为SYN Timeout,一般来说这个时间是分钟的数量级(大约为30秒-2分钟)。一个用户出现异常导致服务器的一个线程等待1分钟并不是什么很大的问题,
但如果有一个恶意的攻击者大量模拟这种情况,服务器端将为了维护一个非常大的半连接列表而消耗非常多的资源----数以万计的半连接,即使是简单的保存并遍历也会消耗非常多的CPU时间和内存,何况还要不断对这个列表中的IP进行SYN+ACK的重试。
实际上如果服务器的TCP/IP栈不够强大,最后的结果往往是堆栈溢出崩溃---即使服务器端的系统足够强大,服务器端也将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求(毕竟客户端的正常请求比率非常之小)。
此时从正常客户的角度看来,服务器失去响应,
这种情况我们称作:服务器端受到了SYN Flood攻击(SYN洪水攻击)。



上面的文字可能很多人看不懂,那我们用比较简单的例子来解释:

1.第一次握手-----------电脑:服务器,你有陈冠希的照片吗?
2.第二次握手-----------服务器:有,你是不是想要?
3.第三次握手-----------电脑:当然想,你传给我。
4.正式建立连接,双方开始传输照片。

在上面的例子中,如果电脑没有回答服务器的问题,就是第三次握手还没有完成,这样的连接就叫做“半开连接”。


微软为了防止SYN洪水攻击,在XP SP2中,限制了最大并发半开连接数为10。
也就是说,使用XP SP2的电脑,最多可以同时向十台服务器询问:“服务器,你有陈冠希的照片吗”。
如果电脑不回答服务器的发问:“有,你是不是想要?”的话,
它就不能向第十一台服务器询问了。
它必须先对前面十台服务器中的随便某一台回答“当然想,你传给我”,完成一次连接之后,才能向第十一台服务器进行询问。


说到这里,大家应该明白了吧?
微软所谓的半开连接数限制,只是针对发起方(也就是上面例子中的电脑)的,不是针对接受方(也就是上面例子中的服务器)!
一台使用XP SP2的电脑,如果它是半开连接的发起方,它就会受到这个限制。
如果它是半开连接的接受方,那么,它是不会受到这个半开连接数的限制的!

以上只是针对XP SP2的分析,如果是使用2003或者2008的电脑呢?
也是同样的道理,如果2003或者2008是接受方,比如我们常见的WEB服务器或者FTP服务器,那它们也不会受到半开连接数的限制!
哪怕它们的最大并发半开连接数同样是10,也不会对它们的HTTP服务,或者FTP服务,有任何影响!

那么,该回到主题了,到底2003有没有限制最大并发半开连接数呢?
楼主的分析已经很清楚了:
以英文企业版Windows 2003 SP2的tcpip.sys为例,TCPMaxHalfOpen是5000。
这很好的说明了,
微软对英文企业版2003 SP2的最大并发半开连接数的限制为5000!

我们再想一想,现在互联网上有很多使用2003来架构的网站或者论坛,
它们的最大同时访问量往往是用数万为单位来计算的,
但是用户访问网站或者登陆论坛却没有感受到什么影响,除非是服务器受到SYN洪水攻击。
这不正好说明了,微软所谓的半开连接数限制,只是针对发起方的吗?

所以我们可以得出一个结论:
2003或者2008,同样有半开连接数的限制,
只不过,只有当它们作为连接的发起方,比如BT下载的客户端,P2P网络电视的使用者时,才会受到这个限制;
在它们作为连接的接受方,比如WEB服务器,或者FTP服务器时,是不会受到限制的。
最后再解释一下注册表中的TCPMaxHalfOpen相关项目的设置和用途:


首先,SynAttackProtect的键值,类型为REG_DWORD,取值范围是0,1。从WIN2003 SP1开始默认值是1。
这个值决定了系统受到SYN攻击时采取的保护措施,包括减少系统SYN+ACK的重试的次数等。

其次,TcpMaxHalfOpen的键值,类型为REG_DWORD,取值范围是100-0xFFFF,这个值是系统允许同时打开的半连接。
默认情况下WIN2K PRO和SERVER是100,ADVANCED SERVER是500,WIN2003是5000。

然后,TcpMaxHalfOpenRetried的键值,类型为REG_DWORD,取值范围是80-0xFFFF,这个值决定了在什么情况下系统会打开SYN攻击保护。
默认情况下WIN2K PRO和SERVER是80,ADVANCED SERVER是400,WIN2003是2500。


Win2003的SYN攻击保护机制是这样的:

正常情况下,WIN2003对TCP连接的三次握手有一个常规的设置,
包括SYN Timeout时间、SYN-ACK的重试次数和SYN报文从路由器到系统再到Winsock的延时等。
这个常规设置是针对系统性能进行优化的(安全和性能往往相互矛盾),所以可以给用户提供方便快捷的服务。

一旦服务器受到攻击,SYN半连接的数量超过TcpMaxHalfOpenRetried的设置,系统会认为自己受到了SYN Flood攻击。
此时,设置在SynAttackProtect键值中的选项开始作用,SYN Timeout时间被减短,SYN-ACK的重试次数减少,
系统也会自动对缓冲区中的报文进行延时,避免对TCP/IP堆栈造成过大的冲击,力图将攻击危害减到最低。
如果攻击强度不断增大,超过了TcpMaxHalfOpen值,此时系统已经不能提供正常的服务了,更重要的是保证系统不会崩溃,
系统将会丢弃任何超出TcpMaxHalfOpen值范围的SYN报文(应该是使用随机丢包策略),保证系统的稳定性。



所以,把TcpMaxHalfOpen值改小,只是为了加强系统对SYN洪水攻击的防御能力;
改大,再大也超不过TCPIP.SYS的限制。
这是微软对于“半开连接”接受方所采取的一种保护措施,
和对“半开连接”发起方所采取的最大并发连接数限制,
是相辅相成的。

分享到:
评论

相关推荐

    TCP协议的SYN Flood攻击原理详细讲解

    TCP连接的关闭则需要四次挥手,确保两个方向的数据传输都被确认终止。 SYN Flood攻击的防御策略通常包括: 1. **SYN Cookie**:服务器使用一种技术,将SYN请求的部分信息加密,并作为SYN+ACK响应的一部分返回,这样...

    TCP SYN Flood分析

    TCP SYN Flood 攻击是一种常见的分布式拒绝服务(DDoS)攻击手段,通过向目标服务器发送大量未完成的TCP连接请求(SYN包),使服务器资源耗尽,导致合法用户无法访问服务。这种攻击利用了TCP三次握手过程中的漏洞。 ...

    awl-0.2.tar.gz TCP SYN洪水攻击 linux工具

    3. 增加连接队列:增大TCP连接队列的大小可以吸收更多的SYN请求,但这并不能解决根本问题,因为攻击者可能会增加发送速率。 4. DDoS防护服务:使用专门的DDoS防护服务或硬件设备,这些设备能够识别并过滤异常流量。...

    内核tcp的syn包skbuffer构造发送模块

    在这个场景中,我们将深入探讨“内核TCP的SYN包skbuffer构造发送模块”,以及它与SYN攻击和内核构造包的关联。 首先,让我们了解`skbuffer`(socket buffer)。`skbuffer`是Linux内核中用于处理网络数据包的数据...

    操作系统安全:防syn 攻击优化配置.docx

    SYN攻击是TCP/IP协议栈中的一种拒绝服务(DoS)攻击方式,它利用TCP三次握手过程中的漏洞,通过伪造大量的SYN请求,使得服务器资源耗尽,无法处理正常连接。以下是关于SYN攻击的原理和防御策略的详细解释。 ### SYN...

    syn攻击检测技术实现

    检测SYN攻击主要观察系统中的半连接(SYN_RECV)状态的TCP连接数量。若发现异常增长,可能正遭受攻击。此外,网络日志分析、入侵检测系统(IDS)和防火墙也可以用于检测异常流量和SYN风暴。例如,监控SYN包的数量、...

    SYN扫描器详细源代码

    首先,我们需要了解TCP连接的建立过程,即著名的三次握手。当客户端想要与服务器建立连接时,会发送一个带有SYN标志的数据包,这就是SYN段。服务器接收到这个请求后,会回应一个SYN+ACK段,表示它愿意建立连接。最后...

    Linux下基于SYN Cookie的防SYN Flood攻击的实现与改进.pdf

    在TCP连接建立过程中,客户端向服务器发送SYN报文,服务器收到后返回SYN-ACK报文,客户端则返回ACK报文以确认连接的建立。如果攻击者发送大量的SYN报文,而不发送ACK报文,那么服务器将等待超时后重试,导致服务器的...

    PortScan_TCP.zip_PortScan_TCP_connect_syn port_tcp portscan_端口 1

    TCP SYN扫描,也被称为半开扫描,因为它只执行TCP连接的前两个步骤。扫描器发送一个SYN包给目标主机,如果目标响应了一个SYN+ACK包,说明目标端口是开放的;如果返回RST或无响应,则表明端口是关闭的。这种扫描方式...

    SYN Flooding 攻击

    说明:SYN-Flood攻击输入IP地址上的输入特定端口。数据包源IP地址为一伪造地址,每一次攻击都不断变换源IP地址源端口也是随机变化的。程序没有做到教科书要求的 伪造的源IP地址可路由但是不可达。程序采用的几乎都是...

    SYN攻击常用命令

    通过以上分析,我们可以看出,理解和掌握SYN攻击的原理及防御措施对于维护网络安全至关重要。同时,熟练掌握相关命令的使用,能够在实际操作中快速有效地应对SYN攻击,保护网络系统的稳定运行。

    SYN flood攻击的原理及其防御

    SYN Flood攻击主要是通过伪造大量的TCP连接请求来实现的。攻击者会向目标服务器发送大量的SYN报文,这些报文中包含伪造的源IP地址,这意味着服务器无法将响应的SYN+ACK报文发送回真实的客户端。因此,服务器会在等待...

    syn flood测试工具

    在TCP连接建立时,客户端发送一个SYN(同步序列编号)请求给服务器,服务器回应一个SYN+ACK(同步+确认),然后客户端再回应ACK(确认)。攻击者会伪造大量的SYN请求,使得服务器持续处于半连接状态,消耗资源,最终...

    SYN flood C源代码

    SYN flood是属于DOS攻击的一种典型方式,其发生方式就出现在TCP连接的三次握手中,假设一个用户向服务器发送了SYN报文后突然死机或掉线,那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK报文的(第三次握手...

    tcp 连接数设置,以及查看电脑的连接数

    了解和调整TCP连接数对于优化服务器性能、应对高并发访问和防止DDoS攻击至关重要。然而,增加连接数并不总是解决方案,因为过多的并发连接可能会消耗大量的内存和CPU资源,导致性能下降。因此,合理设定和优化TCP...

    计算机网络实验5 - TCP数据包及连接建立过程分析

    对于TCP连接的建立过程,A的TCP向B发出连接请求报文段,其首部中的同步比特SYN应置为1,并选择序号x(为了防止TCPsyn攻击,分组选择的是经过复杂运算后得到的初始化序号,当然其相对序号应该视作是1),表明传送数据...

    SYN flood攻击的原理及其防御.rar

    SYN Flood攻击是网络层拒绝服务(DoS,Denial of Service)攻击的一种常见形式,其主要目标是消耗受害服务器的TCP连接资源,使其无法正常处理合法用户的请求,从而导致服务中断。攻击者通过伪造大量的SYN报文,模拟...

    基于路由器的TCP连接监控技术的分析与实现.pdf

    TCP-SYN flood是一种常见的拒绝服务攻击手段,它利用TCP连接三次握手机制,打开大量的半开TCP连接,使得目标机器不能进一步接受TCP连接。这个攻击方式的危害性在于,它可以使得目标机器资源耗尽,无法提供正常的服务...

    SYN flood攻击

    总结,SYN Flood攻击是一种常见的DoS攻击手段,利用TCP连接建立过程中的漏洞来消耗服务器资源。WinPcap作为网络封包捕获工具,可以在防御此类攻击中发挥作用,通过对网络流量的监控和分析,及时发现并阻止异常的SYN...

Global site tag (gtag.js) - Google Analytics