backlog参数与SYN Flood攻击

在linux网络编程中,使用listen函数监听套接字,在linux中man其用法,第2个参数解释如下:

The backlog argument defines the maximum length to which the queue of pending connections for sockfd may grow.  If  a connection  request arrives when the queue is full, the client may receive an error with an indication of ECONNREFUSED or, if the underlying protocol supports retransmission, the request may be ignored so that a later reattempt at connection succeeds.

backlog参数定义了sockfd套接字上“未完成连接”队列可增长到的最大值;TCP经过3次握手建立连接,所谓“未完成连接”是指服务端回复SYN+ACK,等待客户端ACK完成连接的SYN_RCVD状态;这个参数的定义比较晦涩,它没有解释“未完成连接”是指处于SYN_RCVD状态的连接,还是尚未被进程接受的处于ESTABLISHED状态的连接,亦或两者皆可;而实际上,backlog的含义从未有过正式的定义。

内核为任何一个给定的监听套接字维护两个队列:“未完成连接”和“已完成连接”,当进程调用accept时,“已完成连接队列”中的队头项将返回给进程,或者如果这个队列为空,那么进程将被投入睡眠,直到TCP在该队列中放入一项才唤醒它。

backlog指定了这两个队列和的最大值,一旦内核中的这两个队列被占用完,其它用户的连接请求就会返回失败(ECONNREFUSED);SYN Flood攻击就是利用这个原理,它通过不进行TCP三次握手中最后一步ACK应答,使服务端的连接处于未完成状态,耗尽系统资源。简单的缓解措施主要有1.缩短连接的Timeout时间;2.减少重传SYN+ACK次数;3.增大backlog,使其能容纳更多连接;但这都是治标不治本方法。

到目前为止,能够有效防范SYN Flood攻击的手段并不多,而SYN Cookie就是其中最著名的一种。SYN Cookie原理由D.J.Bernstain和 Eric Schenk发明,其在linux等诸多操作系统上都有相关实现。

SYN Cookie的原理是在TCP服务器收到SYN包并返回SYN+ACK包时,不分配一个专门的数据区,而是根据这个SYN包计算出一个cookie值。在收到TCP ACK包时,TCP服务器再根据那个cookie值检查这个TCP ACK包的合法性,如果合法,再分配专门的数据区处理此连接。

在linux系统中,打开或关闭SYN Cookie功能,可以通过设置/proc/sys/net/ipv4/tcp_syncookies的值(或在/etc/sysctl.conf中 net.ipv4.tcp_syncookies的值),值为0关闭SYN Cookie功能,值为1打开SYN Cookie功能。

[email protected] :/home/zzy/unix# cat /proc/sys/net/ipv4/tcp_syncookies

1

注意:syncookie严重的违背TCP协议:不允许使用TCP扩展,可能对某些服务产生严重的性能影响(如SMTP转发)。(该实现与BSD上面使用的tcp proxy一样,是违反了RFC中关于TCP连接的三次握手实现的,但是对于防御SYN Flood的确很有用)

如果单纯解决系统负载过高的问题,linux下可以通过调整以下几个参数:

tcp_max_syn_backlog, tcp_synack_retries, tcp_abort_on_overflow,这三个文件都是在/proc/sys/net/ipv4目录下。

tcp_max_syn_backlog:内存中可以缓存多少个SYN请求。该变量需要打开tcp_syncookies才有效。如果服务器负载很高,可以尝试提高该变量的值。

[email protected] :/home/zzy/unix# cat /proc/sys/net/ipv4/tcp_max_syn_backlog

128

tcp_synack_retries:用于TCP三次握手机制中第二次握手,当收到客户端发来的SYN连接请求后,服务端将回复SYN+ACK包,这时服务端处于SYN_RCVD状态,并等待客户端发来的回复ACK包。如果服务端没有收到客户端的ACK包,会重新发送SYN+ACK包,直到收到客户端的ACK包。该变量设置发送 SYN+ACK包的次数,超过这个次数,服务端将放弃连接。默认值是5。

[email protected] :/home/zzy/unix# cat /proc/sys/net/ipv4/tcp_synack_retries

5

tcp_abort_on_overflow:是个布尔值,默认值为0(FALSE关闭)。如果开启,当服务端太忙不能接受新连接时,服务端会发送RST包给客户端,令客户端重新连接。只有在你确信进程真的不能完成连接请求时才打开该选项,该选项会影响客户的使用。(对待已经满载的sendmail、apache这类服务的时候,这个选项可以很快让客户端终止连接,给予服务程序处理已有连接的缓冲机会,所以很多防火墙上推荐打开它)

[email protected] :/home/zzy/unix# cat /proc/sys/net/ipv4/tcp_abort_on_overflow

0

时间: 2024-10-12 15:33:21

backlog参数与SYN Flood攻击的相关文章

SYN Flood攻击及防御方法 (转)

原文连接:http://blog.csdn.net/bill_lee_sh_cn/article/details/6065704 一.为什么Syn Flood会造成危害      这要从操作系统的TCP/IP协议栈的实现说起.当开放了一个TCP端口后,该端口就处于Listening状态,不停地监视发到该端口的Syn报文,一 旦接收到Client发来的Syn报文,就需要为该请求分配一个TCB(Transmission Control Block),通常一个TCB至少需要280个字节,在某些操作系统

浅谈iptables防SYN Flood攻击和CC攻击

------------------------本人为自己实践所总结,概念性的东西不全,这里粗劣提下而已,网上很多,本文主要说下目前较流行的syn洪水攻击和cc攻击------------------------------------- 何为syn flood攻击: SYN Flood是一种广为人知的DoS(拒绝服务攻击)是DDoS(分布式拒绝服务攻击)的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,从而使得被攻击方资源耗尽(CPU满负荷或内存不足)的攻击方式(TCP协议

Python实现SYN Flood攻击

0×00 背景 SYN Flood是当前最流行的DoS(拒绝服务攻击)与DDoS(分布式拒绝服务攻击)的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,从而使得被攻击方资源耗尽(CPU满负荷或内存不足)的攻击方式. 0×01 Code 本文章的目是介绍使用python构造packet的方法.使用raw socket来发送packets. 该程序只适用于Linux.windows可以尝试调用winpcap. ''' Syn flood program in python usi

Linux防SYN Flood攻击

抵御SYN SYN攻击是利用TCP/IP协议3次握手的原理,发送大量的建立连接的网络包,但不实际 建立连接,最终导致被攻击服务器的网络队列被占满,无法被正常用户访问. Linux内核提供了若干SYN相关的配置,用命令: sysctl -a | grep syn 看到: net.ipv4.tcp_max_syn_backlog = 1024 net.ipv4.tcp_syncookies = 0 net.ipv4.tcp_synack_retries = 5 net.ipv4.tcp_syn_re

利用iptables防止syn flood攻击

命令: iptables -N syn-floodiptables -A syn-flood -m limit --limit 50/s --limit-burst 10 -j RETURNiptables -A syn-flood -j DROP iptables -I INPUT -j syn-flood 解释: -N 创建一个条新的链 --limit 50/s 表示每秒50次;1/m 则为每分钟一次 --limit-burst 表示允许触发 limit 限制的最大包个数 (预设5),它就像

扯谈网络编程之Tcp SYN flood洪水攻击

简介 TCP协议要经过三次握手才能建立连接: (from wiki) 于是出现了对于握手过程进行的攻击.攻击者发送大量的FIN包,服务器回应(SYN+ACK)包,但是攻击者不回应ACK包,这样的话,服务器不知道(SYN+ACK)是否发送成功,默认情况下会重试5次(tcp_syn_retries).这样的话,对于服务器的内存,带宽都有很大的消耗.攻击者如果处于公网,可以伪造IP的话,对于服务器就很难根据IP来判断攻击者,给防护带来很大的困难. 攻与防 攻击者角度 从攻击者的角度来看,有两个地方可以

SYN Flood了解和简单防范笔记!

一:什么是CentOS SYN Flood攻击? CentOS SYN Flood攻击利用的是IPv4中TCP协议的三次握手(Three-Way Handshake)过程进行的攻击.这个协议规定,如果一端想向另一端发起TCP连接,它需要首先发送TCP SYN (synchronize)包到对方. 对方收到后发送一个TCP SYN+ACK包回来,发起方再发送TCP ACK (ACKnowledge Character)包回去,这样三次握手就结束了.在上述过程中,还有一些重要的概念. 未连接队列:在

SYN Flood 防范

简介: SYN Flood 是 DoS( 拒绝服务攻击 )与 DDoS( 分布式拒绝服务攻击 )的方式之一,这是一种利用 TCP 协议缺陷,发送大量伪造 TCP 连接请求,从而使得服务器资源耗尽( CPU 满负载或内存不足 )的攻击方式. TCP 三次握手: 1.客户端发送一个包含 SYN 标志的 TCP 报文到服务端,报文指明客户端使用的端口及 TCP 连接的初始序列号. 2.服务器在收到客户端的 SYN 报文后,将返回一个 SYN+ACK 报文,表示接受请求,同时 TCP 序列号加一,ACK

SYN Flood应如何应对

1 什么是SYN Flood攻击 在TCP三次握手时,服务器接收客户端的SYN请求,操作系统将为该请求分配一个TCP(Transmission Control Block),服务器返回一个SYN/ACK请求,并将处于SYN_RCVD状态(半开连接状态). 从以上过程可以看到,如果恶意的向某个服务器端口发送大量的SYN包,则可以使服务器打开大量的半开连接,分配TCB,从而消耗大量的服务器资源,同时也使得正常的连接请求无法被相应.而攻击发起方的资源消耗相比较可忽略不计. SYN Flood是当前最流