登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> 程序员学前班[不再更新,只读] >> 主题: SYN攻击原理以及检测防范技术[包含扩大半连接数的方法][精华]     [回主站]     [分站链接]
标题
SYN攻击原理以及检测防范技术[包含扩大半连接数的方法][精华]
clq
浏览(0) + 2009-06-26 09:56:24 发表 编辑

关键字:

[2021-03-28 00:43:06 最后更新]
SYN攻击原理以及检测防范技术[包含扩大半连接数的方法][精华]

http://www.seobbs.net/read.php?tid=15981
--------------------------------------------------

SYN攻击原理以及检测防范技术
据统计,在所有黑客攻击事件中,SYN攻击是最常见又最容易被利用的一种攻击手法。相信很多人还记得2000年YAHOO网站遭受的攻击事例,当时黑客利用的就是简单而有效的SYN 攻击,有些网络蠕虫病毒配合SYN攻击造成更大的破坏。本文介绍SYN攻击的基本原理、工具及检测方法,并全面探讨SYN攻击防范技术。

  一、TCP握手协议

  在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。

  第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

  第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

  完成三次握手,客户端与服务器开始传送数据,在上述过程中,还有一些重要的概念:

未连接队列:在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于Syn_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入 ESTABLISHED状态。
Backlog参数:表示未连接队列的最大容纳数目。

  SYN-ACK 重传次数 服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。

  半连接存活时间:是指半连接队列的条目存活的最长时间,也即服务从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时我们也称半连接存活时间为Timeout时间、SYN_RECV存活时间。

  二、SYN攻击原理

  SYN攻击属于DOS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。SYN攻击除了能影响主机外,还可以危害路由器、防火墙等网络系统,事实上SYN攻击并不管目标是什么系统,只要这些系统打开TCP服务就可以实施。从上图可看到,服务器接收到连接请求(syn=j),将此信息加入未连接队列,并发送请求包给客户(syn=k,ack=j+1),此时进入SYN_RECV状态。当服务器未收到客户端的确认包时,重发请求包,一直到超时,才将此条目从未连接队列删除。配合IP欺骗,SYN攻击能达到很好的效果,通常,客户端在短时间内伪造大量不存在的IP 地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。

  三、SYN攻击工具

  SYN攻击实现起来非常的简单,互联网上有大量现成的SYN攻击工具。

  1、windows系统下的SYN工具

  以synkill.exe为例,运行工具,选择随机的源地址和源端囗,并填写目标机器地址和TCP端囗,激活运行,很快就会发现目标系统运行缓慢。如果攻击效果不明显,可能是目标机器并未开启所填写的TCP端囗或者防火墙拒绝访问该端囗,此时可选择允许访问的TCP端囗,通常,windows系统开放 tcp139端囗,UNIX系统开放tcp7、21、23等端囗。

  四、检测SYN攻击

  检测SYN攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击。我们使用系统自带的netstat 工具来检测SYN攻击:

  # netstat -n -p TCP
  tcp 0  0 10.11.11.11:23  124.173.152.8:25882  SYN_RECV -
  tcp 0  0 10.11.11.11:23  236.15.133.204:2577  SYN_RECV -
  tcp 0  0 10.11.11.11:23  127.160.6.129:51748  SYN_RECV -
  tcp 0  0 10.11.11.11:23  222.220.13.25:47393  SYN_RECV -
  tcp 0  0 10.11.11.11:23  212.200.204.182:60427 SYN_RECV -
  tcp 0  0 10.11.11.11:23  232.115.18.38:278   SYN_RECV -
  tcp 0  0 10.11.11.11:23  239.116.95.96:5122  SYN_RECV -
  tcp 0  0 10.11.11.11:23  236.219.139.207:49162 SYN_RECV -
  ...

  上面是在LINUX系统中看到的,很多连接处于SYN_RECV状态(在WINDOWS系统中是SYN_RECEIVED状态),源IP地址都是随机的,表明这是一种带有IP欺骗的SYN攻击。

  我们也可以通过下面的命令直接查看在LINUX环境下某个端囗的未连接队列的条目数:

  #netstat -n -p TCP   grep SYN_RECV   grep :22   wc -l
  324

  显示TCP端囗22的未连接数有324个,虽然还远达不到系统极限,但应该引起管理员的注意。

五、SYN攻击防范技术 

  关于SYN攻击防范技术,人们研究得比较早。归纳起来,主要有两大类,一类是通过防火墙、路由器等过滤网关防护,另一类是通过加固TCP/IP协议栈防范.但必须清楚的是,SYN攻击不能完全被阻止,我们所做的是尽可能的减轻SYN攻击的危害,除非将TCP协议重新设计。

  1、过滤网关防护

  这里,过滤网关主要指明防火墙,当然路由器也能成为过滤网关。防火墙部署在不同网络之间,防范外来非法攻击和防止保密信息外泄,它处于客户端和服务器之间,利用它来防护SYN攻击能起到很好的效果。过滤网关防护主要包括超时设置,SYN网关和SYN代理三种。

  ■网关超时设置:防火墙设置SYN转发超时参数(状态检测的防火墙可在状态表里面设置),该参数远小于服务器的timeout时间。当客户端发送完 SYN包,服务端发送确认包后(SYN+ACK),防火墙如果在计数器到期时还未收到客户端的确认包(ACK),则往服务器发送RST包,以使服务器从队列中删去该半连接。值得注意的是,网关超时参数设置不宜过小也不宜过大,超时参数设置过小会影响正常的通讯,设置太大,又会影响防范SYN攻击的效果,必须根据所处的网络应用环境来设置此参数。

  ■SYN网关:SYN网关收到客户端的SYN包时,直接转发给服务器;SYN网关收到服务器的SYN/ACK包后,将该包转发给客户端,同时以客户端的名义给服务器发ACK确认包。此时服务器由半连接状态进入连接状态。当客户端确认包到达时,如果有数据则转发,否则丢弃。事实上,服务器除了维持半连接队列外,还要有一个连接队列,如果发生SYN攻击时,将使连接队列数目增加,但一般服务器所能承受的连接数量比半连接数量大得多,所以这种方法能有效地减轻对服务器的攻击。

  ■SYN代理:当客户端SYN包到达过滤网关时,SYN代理并不转发SYN包,而是以服务器的名义主动回复SYN/ACK包给客户,如果收到客户的ACK包,表明这是正常的访问,此时防火墙向服务器发送ACK包并完成三次握手。SYN代理事实上代替了服务器去处理SYN攻击,此时要求过滤网关自身具有很强的防范SYN攻击能力。

  2、加固tcp/ip协议栈

  防范SYN攻击的另一项主要技术是调整tcp/ip协议栈,修改tcp协议实现。主要方法有SynAttackProtect保护机制、SYN cookies技术、增加最大半连接和缩短超时时间等。tcp/ip协议栈的调整可能会引起某些功能的受限,管理员应该在进行充分了解和测试的前提下进行此项工作。

  ■SynAttackProtect机制

  为防范SYN攻击,win2000系统的tcp/ip 协议栈内嵌了SynAttackProtect机制,Win2003系统也采用此机制。SynAttackProtect机制是通过关闭某些socket 选项,增加额外的连接指示和减少超时时间,使系统能处理更多的SYN连接,以达到防范SYN攻击的目的。默认情况下,Win2000操作系统并不支持 SynAttackProtect保护机制,需要在注册表以下位置增加SynAttackProtect键值:

  HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  当SynAttackProtect值(如无特别说明,本文提到的注册表键值都为十六进制)为0或不设置时,系统不受SynAttackProtect保护。

  当SynAttackProtect值为1时,系统通过减少重传次数和延迟未连接时路由缓冲项(route cache entry)防范SYN攻击。

当 SynAttackProtect值为2时(Microsoft推荐使用此值),系统不仅使用backlog队列,还使用附加的半连接指示,以此来处理更多的SYN连接,使用此键值时,tcp/ip的TCPInitialRTT、window size和可滑动窗囗将被禁止。


  我们应该知道,平时,系统是不启用SynAttackProtect机制的,仅在检测到SYN攻击时,才启用,并调整tcp/ip协议栈。那么系统是如何检测SYN攻击发生的呢?事实上,系统根据TcpMaxHalfOpen,TcpMaxHalfOpenRetried 和TcpMaxPortsExhausted三个参数判断是否遭受SYN攻击。

  TcpMaxHalfOpen 表示能同时处理的最大半连接数,如果超过此值,系统认为正处于SYN攻击中。Win2000 server默认值为100,Win2000 Advanced server为500。

  TcpMaxHalfOpenRetried定义了保存在backlog队列且重传过的半连接数,如果超过此值,系统自动启动 SynAttackProtect机制。Win2000 server默认值为80,Win2000 Advanced server为400。

  TcpMaxPortsExhausted 是指系统拒绝的SYN请求包的数量,默认是5。

  如果想调整以上参数的默认值,可以在注册表里修改(位置与SynAttackProtect相同)

  ■ SYN cookies技术

  我们知道,TCP协议开辟了一个比较大的内存空间backlog队列来存储半连接条目,当SYN请求不断增加,并这个空间,致使系统丢弃SYN连接。为使半连接队列被塞满的情况下,服务器仍能处理新到的SYN请求,SYN cookies技术被设计出来。

  SYN cookies应用于linux、FreeBSD等操作系统,当半连接队列满时,SYN cookies并不丢弃SYN请求,而是通过加密技术来标识半连接状态。

在 TCP实现中,当收到客户端的SYN请求时,服务器需要回复SYN+ACK包给客户端,客户端也要发送确认包给服务器。通常,服务器的初始序列号由服务器按照一定的规律计算得到或采用随机数,但在SYN cookies中,服务器的初始序列号是通过对客户端IP地址、客户端端囗、服务器IP地址和服务器端囗以及其他一些安全数值等要素进行hash运算,加密得到的,称之为cookie。当服务器遭受SYN攻击使得backlog队列满时,服务器并不拒绝新的SYN请求,而是回复cookie(回复包的 SYN序列号)给客户端,如果收到客户端的ACK包,服务器将客户端的ACK序列号减去1得到cookie比较值,并将上述要素进行一次hash运算,看看是否等于此 cookie。如果相等,直接完成三次握手(注意:此时并不用查看此连接是否属于backlog队列)。

  在RedHat linux中,启用SYN cookies是通过在启动环境中设置以下命令来完成:

  # echo 1 > /proc/sys/net/ipv4/tcp_syncookies

  ■ 增加最大半连接数

  大量的SYN请求导致未连接队列被塞满,使正常的TCP连接无法顺利完成三次握手,通过增大未连接队列空间可以缓解这种压力。当然backlog队列需要占用大量的内存资源,不能被无限的扩大。

  WIN2000:除了上面介绍的TcpMaxHalfOpen, TcpMaxHalfOpenRetried参数外,WIN2000操作系统可以通过设置动态backlog(dynamic backlog)来增大系统所能容纳的最大半连接数,配置动态backlog由AFD.SYS驱动完成,AFD.SYS是一种内核级的驱动,用于支持基于 window socket的应用程序,比如ftp、telnet等。AFD.SYS在注册表的位置:
HKLM\System\CurrentControlSet\Services\AFD\ParametersEnableDynamicBacklog值为1时,表示启用动态backlog,可以修改最大半连接数。 

MinimumDynamicBacklog 表示半连接队列为单个TCP端囗分配的最小空闲连接数,当该TCP端囗在backlog队列的空闲连接小于此临界值时,系统为此端囗自动启用扩展的空闲连接(DynamicBacklogGrowthDelta),Microsoft推荐该值为20。


  MaximumDynamicBacklog是当前活动的半连接和空闲连接的和,当此和超过某个临界值时,系统拒绝SYN包,Microsoft推荐MaximumDynamicBacklog值不得超过2000。

  DynamicBacklogGrowthDelta值是指扩展的空闲连接数,此连接数并不计算在MaximumDynamicBacklog内,当半连接队列为某个TCP端囗分配的空闲连接小于MinimumDynamicBacklog时,系统自动分配 DynamicBacklogGrowthDelta所定义的空闲连接空间,以使该TCP端囗能处理更多的半连接。Microsoft推荐该值为10。

  LINUX:Linux用变量tcp_max_syn_backlog定义backlog队列容纳的最大半连接数。在Redhat 7.3中,该变量的值默认为256,这个值是远远不够的,一次强度不大的SYN攻击就能使半连接队列占满。我们可以通过以下命令修改此变量的值:

  # sysctl -w net.ipv4.tcp_max_syn_backlog="2048"

  Sun Solaris Sun Solaris用变量tcp_conn_req_max_q0来定义最大半连接数,在Sun Solaris 8中,该值默认为1024,可以通过add命令改变这个值:

  # ndd -set /dev/tcp tcp_conn_req_max_q0 2048

  HP-UX:HP-UX用变量tcp_syn_rcvd_max来定义最大半连接数,在HP-UX 11.00中,该值默认为500,可以通过ndd命令改变默认值:

  #ndd -set /dev/tcp tcp_syn_rcvd_max 2048

  ■缩短超时时间

  上文提到,通过增大backlog队列能防范SYN攻击;另外减少超时时间也使系统能处理更多的SYN请求。我们知道,timeout超时时间,也即半连接存活时间,是系统所有重传次数等待的超时时间总和,这个值越大,半连接数占用backlog队列的时间就越长,系统能处理的SYN请求就越少。为缩短超时时间,可以通过缩短重传超时时间(一般是第一次重传超时时间)和减少重传次数来实现。

  Win2000第一次重传之前等待时间默认为3秒,为改变此默认值,可以通过修改网络接囗在注册表里的TcpInitialRtt注册值来完成。重传次数由 TcpMaxConnectResponseRetransmissions 来定义,注册表的位置是:HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters registry key。

  当然我们也可以把重传次数设置为0次,这样服务器如果在3秒内还未收到ack确认包就自动从backlog队列中删除该连接条目。

  LINUX:Redhat使用变量tcp_synack_retries定义重传次数,其默认值是5次,总超时时间需要3分钟。

  Sun Solaris Solaris 默认的重传次数是3次,总超时时间为3分钟,可以通过ndd命令修改这些默认值。

clq
2009-6-26 10:00:40 发表 编辑

backlog 对应

//关于SOMAXCONN是有一些讨论的,也许为128或者256比较好
if (::listen(socket_handle, SOMAXCONN) == SOCKET_ERROR)

中的第2个参数,实际上通过 mysql 的源码可以知道,mysql 服务器的配置中是有一个 back_log 来对应的.

clq
2009-6-26 10:37:15 发表 编辑

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"TcpTimedWaitDelay"=dword:0000001e

此值是TIME_WAIT状态的最长时间。缺省为240秒,最低为30秒,最高为300秒。建议为30秒。

--------------------------------------------------
CSNA网络分析社区

如何关闭time_wait连接?
ge_xin_yu

初学者

Rank: 1

* 个人空间
* 发短消息
* 加为好友
* 当前离线


1# 大 中 小 发表于 2006-9-19 02:08 只看该作者
如何关闭time_wait连接?
今天在电影服务器上使用NETSTAT -AN察看系统连接,发现有大量的TIME_WAIT连接,IP都是内网用户访问电影服务器时留下的,有的IP甚至有200-300个连接。网上查了一些资料,都说TIME_WAIT连接的默认时间是240秒,也就是四分钟。但是10分钟以后这些连接还没有消失。重启服务器,查看连接还在。请教诸位,有没有手动关闭这些连接的方法?另外,大量的time_wait对系统有哪些方面的影响?非常感谢!!

UID
4426
帖子
6
精华
0
积分
0
阅读权限
10
在线时间
3 小时
注册时间
2006-9-11
最后登录
2008-9-23

查看详细资料


TOP
免费下载科来网络分析系统技术交流版6.9!
ValorZ

功勋会员

Rank: 5Rank: 5

CSNA十大杰出青年 功勋版主

* 个人空间
* 发短消息
* 加为好友
* 当前离线


2# 大 中 小 发表于 2006-9-19 10:24 只看该作者
TCP结束的过程如下:

Server Client

-------------- FIN --------------> server: fin_wait_1

<------------- ACK --------------- client: close_wait server:fin_wait_2

<------------- FIN --------------- client发出fin之后就关闭

-------------- ACK -------------> server发出ack后进入time_wait状态

Time_Wait的默认时间是2倍的MLS,就是240秒钟。MLS是TCP 片在网上的最长存活时间。
TIME_Wait的主要作用是保证关闭的TCP端口不立即被使用。因为当网络存在延迟时,可能当某个端口被关闭后,网络中还有一些重传的TCP片在发向这个端口,如果这个端口立即建立新的TCP连接,则可能会有影响。所以使用2倍的MSL时间来限制这个端口立即被使用。

现在的问题在于,4分钟的时间有点长。
因此,Time_wait的影响,我想,首先每个TCP连接都各自有个数据结构,叫TCP Control Block.Time_wait的时候这个数据结构没有被释放。所以当有太多的TCP连接时,内存可能会被占用很多。

[ 本帖最后由 ValorZ 于 2006-9-19 10:32 编辑 ]
系统集成、软件外包
赛罗灵软件

UID
214
帖子
399
精华
0
积分
25
阅读权限
50
性别

在线时间
657 小时
注册时间
2006-5-24
最后登录
2009-6-20

查看个人网站

查看详细资料


TOP
免费下载科来网络分析系统技术交流版6.9!
菜鸟人飞

功勋会员

Rank: 5Rank: 5

CSNA十大杰出青年 功勋版主

* 个人空间
* 发短消息
* 加为好友
* 当前离线


3# 大 中 小 发表于 2006-9-19 14:19 只看该作者
To ValorZ:TIME_WAIT状态也称为2MSL等待状态,而不是2MLS,笔误吧!

每个TCP报文在网络内的最长时间,就称为MSL(Maximum Segment Lifetime),它的作用和IP数据包的TTL类似。

RFC793指出,MSL的值是2分钟,但是在实际的实现中,常用的值有以下三种:30秒,1分钟,2分钟。

注意一个问题,进入TIME_WAIT状态的一般情况下是客户端,大多数服务器端一般执行被动关闭,不会进入TIME_WAIT状态,当在服务器端关闭某个服务再重新启动时,它是会进入TIME_WAIT状态的。

举例:
1.客户端连接服务器的80服务,这时客户端会启用一个本地的端口访问服务器的80,访问完成后关闭此连接,立刻再次访问服务器的80,这时客户端会启用另一个本地的端口,而不是刚才使用的那个本地端口。原因就是刚才的那个连接还处于TIME_WAIT状态。
2.客户端连接服务器的80服务,这时服务器关闭80端口,立即再次重启80端口的服务,这时可能不会成功启动,原因也是服务器的连接还处于TIME_WAIT状态。
渴望在最寂静的角落被最热烈的声音包围!
添加 菜鸟人飞 为MSN好友 通过MSN和 菜鸟人飞 交谈 QQ

UID
4
帖子
1402
精华
16
积分
90
阅读权限
50
性别

来自
成都
在线时间
1023 小时
注册时间
2006-4-11
最后登录
2009-6-20

查看详细资料


TOP
免费下载科来网络分析系统技术交流版6.9!
ghostorc

技术爱好者

Rank: 2

* 个人空间
* 发短消息
* 加为好友
* 当前离线


4# 大 中 小 发表于 2006-9-19 14:41 只看该作者
谢谢楼上的版主们的讲解!

UID
3193
帖子
53
精华
0
积分
0
阅读权限
10
在线时间
62 小时
注册时间
2006-8-21
最后登录
2009-4-30

查看详细资料


TOP
免费下载科来网络分析系统技术交流版6.9!
大水牛

分析专家

Rank: 4

* 个人空间
* 发短消息
* 加为好友
* 当前离线


5# 大 中 小 发表于 2006-9-19 22:56 只看该作者
回复 #1 ge_xin_yu 的帖子
大量的time_wait 当然会占用更多的端口与内存资源. 如果是synflood攻击,则会发现有大量的time_wait在排队.如果流量非常大,系统可用资源被占用殆尽,则服务器通常会崩溃掉.正常情况下(非synflood攻击)可以通过增加服务器内存解决并发访问请求过多的状况.

"10分钟以后这些连接还没有消失, 重启服务器,查看连接还在",服务器重启后是会马上就会收到客户端的连接请求.这些连接一直是以前那些IP吗?还是新的IP?用科来抓一下包看看.

一般用不着手动关闭这些连接,超时后系统自然会将状态置位,你其实可以将time_wait时间改小.

如果你的电影服务器是Windows平台,可以修改下面的注册表键值:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"TcpTimedWaitDelay"=dword:0000001e

此值是TIME_WAIT状态的最长时间。缺省为240秒,最低为30秒,最高为300秒。建议为30秒。

UID
2
帖子
35
精华
0
积分
7
阅读权限
50
在线时间
37 小时
注册时间
2006-4-11
最后登录
2009-1-6

查看详细资料


TOP
免费下载科来网络分析系统技术交流版6.9!
ge_xin_yu

初学者

Rank: 1

* 个人空间
* 发短消息
* 加为好友
* 当前离线


6# 大 中 小 发表于 2006-9-20 04:06 只看该作者
非常感谢楼上诸位兄弟的说明!!!

UID
4426
帖子
6
精华
0
积分
0
阅读权限
10
在线时间
3 小时
注册时间
2006-9-11
最后登录
2008-9-23

查看详细资料


TOP
免费下载科来网络分析系统技术交流版6.9!
zhang_ming

初学者

Rank: 1

* 个人空间
* 发短消息
* 加为好友
* 当前离线


7# 大 中 小 发表于 2006-9-21 02:40 只看该作者
版主可不可以共享一些RFC中文版的文档出来?

UID
3615
帖子
22
精华
0
积分
0
阅读权限
10
在线时间
16 小时
注册时间
2006-8-28
最后登录
2007-11-12

查看详细资料


TOP
免费下载科来网络分析系统技术交流版6.9!
allmoxie

初学者

Rank: 1

* 个人空间
* 发短消息
* 加为好友
* 当前离线


8# 大 中 小 发表于 2006-10-2 17:59 只看该作者
支持zhang_ming

UID
4845
帖子
28
精华
0
积分
0
阅读权限
10
在线时间
18 小时
注册时间
2006-9-18
最后登录
2008-1-29

查看详细资料


TOP
免费下载科来网络分析系统技术交流版6.9!
iLRainyday

初学者

Rank: 1

* 个人空间
* 发短消息
* 加为好友
* 当前离线


9# 大 中 小 发表于 2007-5-5 01:17 只看该作者
引用:

正常情况下(非synflood攻击)可以通过增加服务器内存解决并发访问请求过多的状况.

只能缓解,无法解决。

UID
15424
帖子
22
精华
0
积分
0
阅读权限
10
在线时间
39 小时
注册时间
2007-2-5
最后登录
2008-5-31

查看详细资料


TOP
免费下载科来网络分析系统技术交流版6.9!
‹‹ 上一主题 | 下一主题 ››
发新话题
> 新手交流区 > 网络分析 > 协议大全 > 资源共享 > 数据包文件 > 过滤器样本 > 网络基础及网络应用 > 网络安全 > 科来网络分析系统技术交流版 > Sniffer Pro > Ethereal/Wireshark > 其它 > 科来培训/动态

* 控制面板首页
* 编辑个人资料
* 积分记录
* 公众用户组
* 个人空间管理

* 基本概况
* 流量统计
* 客户软件
* 发帖量记录
* 版块排行
* 主题排行
* 发帖排行
* 积分排行
* 交易排行
* 在线时间
* 管理团队
* 管理统计

当前时区 GMT+8, 现在时间是 2009-6-26 10:33 蜀ICP备05009500号

清除 Cookies - 联系我们 - CSNA网络分析社区 - Archiver - WAP - TOP - 界面风格

* 默认风格

Discuz!

Powered by Discuz! 6.0.0 © 2001-2007 Comsenz Inc.

clq
2009-6-26 10:37:23 发表 编辑

TCP/IP 选项TcpTimedWaitDelay设置

当TCP连接被关闭时,{ Protocol, Local IP, Local Port, Remote IP, Remote Port}五元组就进入TIME_WAIT状态,默认时间是4分钟。可以通过一组命令看看tcp的连接状态:

netstat -ano>>c:\port.txt

本地ip,远程ip,远程端口都是固定的,只有本地端口是变化的,本地端口只能使用1024-5000,因此如果在4分钟内发起了大约4000个连接,这时就会发生异常,下面是使用WCF,客户端的异常:

System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted 192.168.101.5:8888
at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
at System.Net.Sockets.Socket.Connect(EndPoint remoteEP)
at System.ServiceModel.Channels.SocketConnectionInitiator.Connect(Uri uri, TimeSpan timeout)

TCP有个选项 TcpTimedWaitDelay:
确定 TCP/IP 可释放已关闭连接并重用其资源前,必须经过的时间。关闭和释放之间的此时间间隔通称 TIME_WAIT 状态或两倍最大段生命周期(2MSL)状态。此时间期间,重新打开到客户机和服务器的连接的成本少于建立新连接。减少此条目的值允许 TCP/IP 更快地释放已关闭的连接,为新连接提供更多资源。如果运行的应用程序需要快速释放和创建新连接,而且由于 TIME_WAIT 中存在很多连接,导致低吞吐量,则调整此参数。

Exchange Server 2007 服务器的缺省值是60,http://technet.microsoft.com/zh-cn/library/bb397379.aspx



1.

打开注册表编辑器,如 Regedit.exe 或 Regedt32.exe。
2.

导航到:HKLM\System\CurrentControlSet\Services\Tcpip\Parameters
3.

双击 TcpTimedWaitDelay,然后将“数值数据”字段设置为 60(十进制)。
4.

关闭注册表编辑器,然后重新启动计算机。

MaxUserPort
描述:
确定在应用程序从系统请求可用用户端口时,TCP/IP 可指定的最高端口号。

如何查看或设置:
使用 regedit 命令访问 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\TCPIP\Parameters 注册表子键并创建名为 MaxUserPort 的新 REG_DWORD 值。停止并重新启动系统。

注:当在 Windows NT 或 Windows 2000 操作系统上调整 erver 时,同时使用这两个参数。

clq
2009-6-26 10:40:28 发表 编辑

MaxUserPort 值太低
本主题旨在解决由 Exchange Server 分析工具发现的特定问题。应只将此主题应用到已对其运行 Exchange Server 分析工具并且正面临该特定问题的系统中。通过可以免费下载的 Exchange Server 分析工具,远程收集拓扑中每台服务器的配置数据并自动分析数据。结果报告详述了重要的配置问题、潜在问题以及一些非默认产品设置。通过遵守这些建议,可以获得更佳的性能、可伸缩性、可靠性及正常运行时间。有关此工具或下载最新版本的详细信息,请参阅 http://go.microsoft.com/fwlink/?linkid=34707(英文网页)上的“Microsoft Exchange 分析工具”。

主题上次修改时间: 2005-11-18

Microsoft® Exchange Server 分析工具读取以下注册表项,以确定 TCP 临时端口的最大值:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\MaxUserPort

临时端口是短暂使用的端口。

如果 Exchange Server 分析工具发现 MaxUserPort 注册表项的值小于 50000,则 Exchange Server 分析工具将显示警告。

MaxUserPort 值指定在应用程序向系统请求可用的用户端口时,TCP 可以分配的最高端口号。通常,为临时端口分配的端口号为 1024 到 5000。

默认情况下,Microsoft Windows Server™ 2003 将 MaxUserPort 值设置为 5000。Microsoft Windows® 2000 不将 MaxUserPort 值添加到注册表中。可以手动将 MaxUserPort 值添加到注册表中。但是,在 Windows Server 2003 和 Windows 2000 Server 上,Exchange Server 2003 将默认值设置为 60000。Exchange 2000 Server 不设置值。

建议将 MaxUserPort 值设置为 60000。如果设置的 MaxUserPort 值低于 60000,可能会显示名称服务提供程序接口 (NSPI) 代理警告,例如事件 9040。事件 9040 在下表中介绍。
事件 ID 9040

事件类别


NSPI 代理

事件来源


MSExchangeSA

事件类型


警告

事件描述


NSPI 代理在接收数据包时出错。目标域控制器、网络或某个客户端可能已关闭。Winsock 子系统返回错误:[0x2746]。收到该错误的电路将关闭。

若要解决此警告问题,请将 MaxUserPort 注册表项的值设置为 60000。
Aa995661.note(zh-cn,EXCHG.80).gif重要信息:
本文包含有关编辑注册表的信息。在编辑注册表之前,请确保了解当出现问题时如何还原注册表。有关如何还原注册表的信息,请参阅 Regedit.exe 或 Regedt32.exe 中的“还原注册表”帮助主题。
解决此警告问题

1.

打开注册表编辑器,如 Regedit.exe 或 Regedt32.exe。
2.

导航到:HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
3.

双击 MaxUserPort,将“数值数据”字段设置为 ea60(十六进制),再单击“确定”。
4.

关闭注册表编辑器,并重新启动计算机,以使该设置生效。

编辑注册表之前,要获取有关如何编辑注册表的信息,请参阅 Microsoft 知识库文章 256986“Microsoft Windows 注册表说明”(http://support.microsoft.com/kb/256986/zh-cn)。
个人信息中心 | 联系我们 | 中文速递邮件
© 2009 Microsoft Corporation 版权所有。 保留所有权利 | 商标 | 隐私权声明

clq
2009-6-26 10:43:56 发表 编辑

深度分析“Windows2003于XP一样有半开连接数限制”收藏

在讨论“半开连接”之前,我觉得最重要的一点是,必须弄清楚什么是“半开连接”。
很遗憾,在这个文章里面回复的绝大部分人,可能包括我没有看到这个之前在内,都不知道什么是“半开连接”,更加不知道微软为什么要进行限制。
所以就有诸如“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的限制。
这是微软对于“半开连接”接受方所采取的一种保护措施,
和对“半开连接”发起方所采取的最大并发连接数限制,
是相辅相成的。

clq
2009-6-26 11:25:29 发表 编辑

附件[暂不开放下载]
对于我的情况,实际上是要系统能承受最多的短连接.(类似于 http, 不过这里指的是连接 mysql 查询后立即断开. 不调整的话就会发生著名的 "mysql has gone away" 的问题, 对这个问题网上说的什么加大缓冲区呀什么的统统不对,修改这里的参数和 socket 监听 listen 函数的 back_log 才是真正的解决办法)

--------------------------------------------------
以下是参数效果.

修改
"TcpTimedWaitDelay"=dword:00000005
后,仍然有 "mysql has gone away" 但等待很短时间后就可以再用了.以前要等很久.表现为 netstat -a 命令后的 TIME_WAIT 状态连接很多,消失的时间变短了 -- 消失后即可重连接了.

修改
"MaxUserPort"=dword:00055000
后 TIME_WAIT 不变,但系统承受能力明显加强了. "mysql has gone away" 没有再出现. 不过我看到本地端口已经超过 55000 居然还能正常工作,比较奇怪.
--------------------------------------------------
我的系统是 windows xp sp3
windows 2003 sp2 下,即使不改 my.ini 中的 back_log 也是 ok 的.


总数:6 页次:1/1 首页 尾页  
总数:6 页次:1/1 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1