`
zfy421
  • 浏览: 232694 次
社区版块
存档分类
最新评论

TCP洪水攻击(SYN Flood)的诊断和处理

阅读更多

转自:http://tech.uc.cn/?p=1790

1. SYN Flood介绍

前段时间网站被攻击多次,其中最猛烈的就是TCP洪水攻击,即SYN Flood。

SYN Flood是当前最流行的DoS(拒绝服务攻击)与DDoS(分布式拒绝服务攻击)的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,常用假冒的IP或IP号段发来海量的请求连接的第一个握手包(SYN包),被攻击服务器回应第二个握手包(SYN+ACK包),因为对方是假冒IP,对方永远收不到包且不会回应第三个握手包。导致被攻击服务器保持大量SYN_RECV状态的“半连接”,并且会重试默认5次回应第二个握手包,塞满TCP等待连接队列,资源耗尽(CPU满负荷或内存不足),让正常的业务请求连接不进来。

详细的原理,网上有很多介绍,应对办法也很多,但大部分没什么效果,这里介绍我们是如何诊断和应对的。

2. 诊断

我们看到业务曲线大跌时,检查机器和DNS,发现只是对外的web机响应慢、CPU负载高、ssh登陆慢甚至有些机器登陆不上,检查系统syslog:

# tail -f /var/log/messages
Apr 18 11:21:56 web5 kernel: possible SYN flooding on port 80. Sending cookies.

检查连接数增多,并且SYN_RECV 连接特别多:
# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 
TIME_WAIT 16855
CLOSE_WAIT 21
SYN_SENT 99
FIN_WAIT1 229
FIN_WAIT2 113
ESTABLISHED 8358
SYN_RECV 48965
CLOSING 3
LAST_ACK 313

 

根据经验,正常时检查连接数如下:
# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 
TIME_WAIT 42349
CLOSE_WAIT 1
SYN_SENT 4
FIN_WAIT1 298
FIN_WAIT2 33
ESTABLISHED 12775
SYN_RECV 259
CLOSING 6
LAST_ACK 432

以上就是TCP洪水攻击的两大特征。执行netstat -na>指定文件,保留罪证。

3. 应急处理

根据netstat查看到的对方IP特征:
# netstat -na |grep SYN_RECV|more

利用iptables临时封掉最大嫌疑攻击的IP或IP号段,例如对方假冒173.*.*.*号段来攻击,短期禁用173.*.*.*这个大号段(要确认小心不要封掉自己的本地IP了!)
# iptables -A INPUT -s  173.0.0.0/8  -p tcp  –dport 80 -j DROP

再分析刚才保留的罪证,分析业务,用iptables解封正常173.*.*.*号段内正常的ip和子网段。这样应急处理很容易误伤,甚至可能因为封错了导致ssh登陆不了服务器,并不是理想方式。

4. 使用F5挡攻击

应急处理毕竟太被动,因为本机房的F5比较空闲,运维利用F5来挡攻击,采用方式:让客户端先和F5三次握手,连接建立之后F5才转发到后端业务服务器。后来被攻击时F5上看到的现象:
1. 连接数比平时多了500万,攻击停止后恢复。
2. 修改F5上我们业务的VS模式后,F5的CPU消耗比平时多7%,攻击停止后恢复。
3. 用F5挡效果明显,后来因攻击无效后,用户很少来攻击了,毕竟攻击也是有成本的。

5. 调整系统参数挡攻击

没有F5这种高级且昂贵的设备怎么办?我测试过以下参数组合能明显减小影响,准备以后不用F5抗攻击。

第一个参数tcp_synack_retries = 0是关键,表示回应第二个握手包(SYN+ACK包)给客户端IP后,如果收不到第三次握手包(ACK包)后,不进行重试,加快回收“半连接”,不要耗光资源。

不修改这个参数,模拟攻击,10秒后被攻击的80端口即无法服务,机器难以ssh登录; 用命令netstat -na |grep SYN_RECV检测“半连接”hold住180秒;

修改这个参数为0,再模拟攻击,持续10分钟后被攻击的80端口都可以服务,响应稍慢些而已,只是ssh有时也登录不上;检测“半连接”只hold住3秒即释放掉。

修改这个参数为0的副作用:网络状况很差时,如果对方没收到第二个握手包,可能连接服务器失败,但对于一般网站,用户刷新一次页面即可。这些可以在高峰期或网络状况不好时tcpdump抓包验证下。

根据以前的抓包经验,这种情况很少,但为了保险起见,可以只在被tcp洪水攻击时临时启用这个参数。

tcp_synack_retries默认为5,表示重发5次,每次等待30~40秒,即“半连接”默认hold住大约180秒。详细解释:

The tcp_synack_retries setting tells the kernel how many times to retransmit the SYN,ACK reply to
an SYN request. In other words, this tells the system how many times to try to establish a passive
TCP connection that was started by another host.
This variable takes an integer value, but should under no circumstances be larger than 255 for the
same reasons as for the tcp_syn_retries variable. Each retransmission will take aproximately 30-40
seconds. The default value of the tcp_synack_retries variable is 5, and hence the default timeout
of passive TCP connections is aproximately 180 seconds.

 

之所以可以把tcp_synack_retries改为0,因为客户端还有tcp_syn_retries参数,默认是5,即使服务器端没有重发SYN+ACK包,客户端也会重发SYN握手包。详细解释:

The tcp_syn_retries variable tells the kernel how many times to try to retransmit the initial SYN
packet for an active TCP connection attempt.
This variable takes an integer value, but should not be set higher than 255 since each
retransmission will consume huge amounts of time as well as some amounts of bandwidth. Each
connection retransmission takes aproximately 30-40 seconds. The default setting is 5, which
would lead to an aproximate of 180 seconds delay before the connection times out.

 

第二个参数net.ipv4.tcp_max_syn_backlog = 200000也重要,具体多少数值受限于内存。

以下配置,第一段参数是最重要的,第二段参数是辅助的,其余参数是其他作用的:
# vi /etc/sysctl.conf

 

 

使配置生效:
# sysctl -p

注意,以下参数面对外网时,不要打开。因为副作用很明显,具体原因请google,如果已打开请显式改为0,然后执行sysctl -p关闭。因为经过试验,大量TIME_WAIT状态的连接对系统没太大影响:

 

 

为了处理大量连接,还需改大另一个参数:
# vi /etc/security/limits.conf 

在底下添加一行表示允许每个用户都最大可打开409600个文件句柄(包括连接):
*                -       nofile          409600

分享到:
评论

相关推荐

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

    TCP协议的SYN Flood攻击是网络层的一种拒绝服务(DDoS)攻击手段,它通过大量伪造的SYN请求,使目标服务器陷入持续的握手过程,消耗大量资源,从而导致正常服务无法进行。TCP协议作为互联网上的重要协议,因其可靠的...

    TCP SYN Flood分析

    ### TCP SYN Flood 攻击分析 #### 一、TCP SYN Flood 攻击概述 ...通过对TCP SYN Flood攻击原理及其分析方法的深入了解,我们可以更好地理解这种攻击的工作机制,并采取相应的预防措施,保护网络和服务的安全稳定。

    SYN flood C源代码

    实际上如果服务器的TCP/IP栈不够强大,最后的结果往往是堆栈溢出崩溃---即使服务器端的系统足够强大,服务器端也将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求(毕竟客户端的正常请求比率非常之小),...

    syn flood测试工具

    为了了解和测试网络安全,开发者和研究人员创建了一些工具来模拟SYN Flood攻击,以检测网络防御机制的效能。这些工具通常允许用户设置不同的参数,如SYN包的数量、频率和源IP地址,以便于模拟不同强度的攻击场景。...

    SYN Flood攻击源程序

    Microsoft Visual C++ 6.0环境下的syn flood源程序

    synflood.zip

    标题“synflood.zip”指的是一个包含用于模拟SYN Flood攻击的工具的压缩包。SYN Flood是一种拒绝服务(DoS)攻击,攻击者通过发送大量伪造的TCP连接请求(SYN包)来淹没目标服务器,使其无法处理合法用户的请求。...

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

    SYN Flood攻击是DoS攻击的一种,它利用了TCP协议的三次握手机制对服务器进行攻击。在TCP连接建立过程中,客户端向服务器发送SYN报文,服务器收到后返回SYN-ACK报文,客户端则返回ACK报文以确认连接的建立。如果攻击...

    syn flood 代码

    在`SynfloodThread`函数中,构造了TCP和IP头部,填充了必要的字段,并通过`sendto`函数将SYN报文发送到指定的目的地址。这里需要注意的是,为了模拟SYN Flood攻击,通常会使用伪造的源IP地址和端口,使得服务器无法...

    SYN flood攻击的原理及其防御

    SYN Flood攻击主要利用TCP协议的三次握手机制中的漏洞来发起攻击。 #### 二、TCP三次握手机制 在理解SYN Flood攻击之前,首先需要了解TCP协议的三次握手过程: 1. **第一次握手**:客户端向服务器发送SYN报文段,...

    原始套接字 synflood攻击

    syn flood c的简易实现,编译即可

    Linux下synflood源码

    Synflood是一种拒绝服务(DoS)攻击,它利用TCP协议的三次握手过程来消耗目标服务器的资源,导致正常的服务请求无法处理。在这里,我们将详细探讨Linux环境下synflood攻击的原理,源码的实现细节以及相关的防御策略...

    测试syn-flood等泛洪攻击的小软件

    可以模拟syn flood udp flood等泛洪攻击的一款小软件,360会报警。

    syn flood.zip

    **SYN Flood攻击详解** SYN Flood是一种常见的拒绝服务(Denial of Service, DoS)攻击,通过利用TCP协议的握手过程来瘫痪目标...防御此类攻击则需采取多种策略,包括改进的TCP协议处理、连接限制和安全设备的部署。

    Linux平台下防御SYN Flood攻击策略的研究.pdf

    SYN Flood攻击是网络上常见的一种DoS(Denial of Service)攻击,利用TCP三次握手过程中的漏洞,通过发送大量的SYN请求来消耗服务器资源,导致正常用户无法进行连接。在Linux平台上,防御这种攻击的方法通常包括SYN...

    SYN_FLOOD网站工具包

    分享 SYN_FLOOD_和谐网站工具包

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

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

    SYN flood攻击

    SYN Flood攻击是网络层的一种拒绝服务(Denial of Service, DoS)攻击方式,它利用TCP协议建立连接的三次握手过程来耗尽目标服务器的资源,导致正常用户无法访问服务。攻击者通过发送大量的SYN(同步序列编号)请求...

    buha_sources_id_2_dlfile.rar_SYNflood_syn flood

    标签"synflood"和"syn_flood"进一步强调了主题,它们在网络安全领域通常指的是利用TCP连接初始化阶段的SYN(同步序列编号)报文进行的洪水攻击。这种攻击方式通过发送大量的伪造SYN请求,使目标服务器陷入处理半开...

    syn flood tool

    SYN Flood攻击就是通过大量伪造的SYN请求,使服务器持续处于等待确认的状态,从而耗尽其资源,导致正常的服务请求无法处理。 该压缩包文件"SYN flood"可能包含了一个用于模拟SYN Flood攻击的工具,通常这类工具会被...

    synflood 攻击 C语言文件 源码 原始套接字

    synflood源码,C语言实现原始套接字可以直接编译,执行./synflood ip

Global site tag (gtag.js) - Google Analytics