讨论一下如何防范SYN-FLOOD攻击的问题

发表于:2007-07-04来源:作者:点击数: 标签:
有人说echo1/proc/sys/net/ipv4/tcp_syncookies可以组织SYN-FLOOD攻击 还有人说,IPTABLES里设置-mlimitn/s--limit-burstn可以限制并发流来阻止攻击 刚才在VMWARE里做了试验,用软件攻击自己的VMWARE里的APACHE 结果发现/proc/sys/net/ipv4/tcp_syncookies设

有人说echo 1 > /proc/sys/net/ipv4/tcp_syncookies可以组织SYN-FLOOD攻击

还有人说,IPTABLES里设置-m limit n/s --limit-burst n可以限制并发流来阻止攻击

刚才在VMWARE里做了试验,用软件攻击自己的VMWARE里的APACHE
结果发现/proc/sys/net/ipv4/tcp_syncookies设置后无济于事
IPTABLES里做了限制,虽然能限制并发流,不至于让机器的网络瘫痪,但HTTP还是无法使用了,还是达到了“拒绝服务”的效果

很无奈……

我想了另一个解决SYN攻击的方法,但是需要SHELL编程
大家有没有什么高见?

 platinum 回复于:2004-05-29 00:46:39
顶一下

 repol 回复于:2004-05-29 01:23:15
没有哟,等你搞出了,拿你的成果哈
嚸嘿

 双眼皮的猪 回复于:2004-05-29 01:27:02
现在没有能很好抵御syn-flood的方式吧.
对层的概念仍然不很明朗,所以...
不管如何都会塞住带宽...以及路由的低效....
不熟悉,请指教........

 platinum 回复于:2004-05-29 15:34:00
[quote:043c8b9819="双眼皮的猪"]现在没有能很好抵御syn-flood的方式吧.
对层的概念仍然不很明朗,所以...
不管如何都会塞住带宽...以及路由的低效....
不熟悉,请指教........[/quote:043c8b9819]
DDOS是不能防御的,SYN-FLOOD属于DOS,可以防御的

 第二场雪 回复于:2004-05-29 18:25:44
我见到比较好的方法是用防火墙
先由防火墙建立连接经过三次握手再传给服务器对付syn flood

 platinum 回复于:2004-05-29 19:34:32
“经过三次握手再传给服务器对付syn flood”
再阐述一下?
:)

 双眼皮的猪 回复于:2004-05-29 21:06:32
[quote:fdclearcase/" target="_blank" >ccc909a5="platinum"]
DDOS是不能防御的,SYN-FLOOD属于DOS,可以防御的[/quote:fdccc909a5]
谢谢指点:)
上次去北京买了本TCP/IP详解卷一,协议,结果在邯郸搞丢了.
郁闷ing..

这不,签到杭州了,就不去北京陪你玩啦,嘿嘿~[/i]

 第二场雪 回复于:2004-05-29 23:10:08
[quote:649f89b0cf="platinum"]“经过三次握手再传给服务器对付syn flood”
再阐述一下?
:)[/quote:649f89b0cf]
呵呵,其实我也是不懂的,对协议了解不深刻.
一般的syn flood 是大量的客户端去连接服务器.建立一次握手后就不再继续,于是服务器等待超时.
如果大量的sys连接的话就会造成服务器压力或者连接数满而达到目的.
可以用防火墙来先与客户端建立连接,达到三次握手的才传给服务器,减轻服务器压力.但必须好的防火墙啊,他本身就会成为弱点.
还有可以多服务器分时,由防火墙分别按算法发配请求.

 haohaoo 回复于:2004-05-30 08:58:37
把你shell的思想说出来行不?

 llzqq 回复于:2004-05-30 09:09:31
[code:1:78a83a1654]
安装防DDOS攻击软件

# tar -zxvf mod_dosevasive.1.9.tar.gz
# cd mod_dosevasive
# /usr/local/apache/bin/apxs -iac mod_dosevasive20.c
# vim /usr/local/apache/conf/httpd.conf

<IfModule mod_dosevasive.c>
DOSHashTableSize3097
DOSPageCount3
DOSSiteCount50
DOSPageInterval1
DOSSiteInterval1
DOSBlockingPeriod30
</IfModule>
[/code:1:78a83a1654]

 haohaoo 回复于:2004-05-30 09:15:50
[quote:8ecedc5edf="llzqq"][/quote:8ecedc5edf]
这个好象没什么作用,基于apache1的模块

 llzqq 回复于:2004-05-30 10:03:26
这个是 FOR APACHE2的

 platinum 回复于:2004-05-30 10:21:19
[quote:c4d602debb="haohaoo"]把你shell的思想说出来行不?[/quote:c4d602debb]
是这样的,当我们发现被DOS攻击以后怎么办呢?
如何确定是否被DOS攻击呢?
netstat -an,查看ESTABLISHED数,然后禁掉该IP

SHELL思想也类似,写一个SHELL,让CROND每分钟运行一次
SHELL去检查ESTABLISHED数量,然后统计某ESTABLISHED数量最高的IP
然后向iptables里-I INPUT一条-s IP --p tcp --dport PORT -j DROP

也就是说,让防火墙具有自动更改规则的动态机制

这个想法可行吗?

 shiqiaoliang 回复于:2004-05-30 11:32:45
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT  应该是可以的。

 xinxin_ee 回复于:2004-05-30 11:42:26
“SHELL去检查ESTABLISHED数量,然后统计某ESTABLISHED数量最高的IP 
然后向iptables里-I INPUT一条-s IP --p tcp --dport PORT -j DROP ”

不行把,每分钟都这样做,那不是很快屏蔽很多网站??!!

 platinum 回复于:2004-05-30 11:43:52
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
这句是有的,否则防火墙不允许其他人连接,我的默认规则是DROP,所以必须加这个,问题是已经加了,但不能防止SYN攻击

 haohaoo 回复于:2004-05-30 14:52:34
[quote:6081fbd063="platinum"]
是这样的,当我们发现被DOS攻击以后怎么办呢?
如何确定是否被DOS攻击呢?
netstat -an,查看ESTABLISHED数,然后禁掉该IP

SHELL思想也类似,写一个SHELL,让CROND每分钟运行一次
SHELL去检查ESTABLISHED数量..........[/quote:6081fbd063]
ESTABLISHED数多少的时候就砍掉呢?

 platinum 回复于:2004-05-30 15:35:13
我想,这是一个阀值问题,可以自己根据服务器的性能配置

同一个IP地址,超过20个ESTABLISHED,就应该可以封了吧,谁会同时连那么多!

 好好先生 回复于:2004-05-30 15:49:01
[quote:a5dddd723a="platinum"]我想,这是一个阀值问题,可以自己根据服务器的性能配置

同一个IP地址,超过20个ESTABLISHED,就应该可以封了吧,谁会同时连那么多![/quote:a5dddd723a]
假如用专线然后用的代理服务器上网呢?对外都是同一个ip吧……但是同事们上同一个网站的话,就是同一个ip。

 platinum 回复于:2004-05-30 15:52:53
这个问题我也想到了
但是,一个单位的同事们会同时有20个人以上来访问吗?
何况HTTP协议不是一直ESTABLISHED的,读完网页就CLOSE
如果同一个IP有20个以上的ESTABLISHED,那肯定不正常
对吧:)

 弱智 回复于:2004-05-30 23:18:43
purge觉得这是一个方法,思路的问题。以前看到过这样的讨论。

比如,可以这样:

做防火墙的机子收到客户端的SYN包时,直接转发给服务器;

然后,收到服务器回应的SYN/ACK包后,一方面将SYN/ACK包转发给客户端,不去管它;
另一方面以客户端的名义给服务器回送一个ACK包,完成TCP的三次握手;这样,可以使服务器完成连接状态。

当客户端真正的ACK包到达时,有数据则转发给服务器,否则丢弃该包。
理由是:服务器能承受连接状态要比半连接状态高得多,所以这种方法能有效地减轻对服务器的攻击。

没有实践过,但是这是一个思路。

 platinum 回复于:2004-05-30 23:56:13
……
去翻翻TCP/IP的资料先
然后想想实现的方法
……

 windoze 回复于:2004-05-31 00:05:03
[quote:4f5b7f8414="弱智"]做防火墙的机子收到客户端的SYN包时,直接转发给服务器; 
然后,收到服务器回应的SYN/ACK包后,一方面将SYN/ACK包转发给客户端,不去管它; 
另一方面以客户端的名义给服务器回送一个ACK包,完成TCP的三次握手;这样,可以使服务器完成连接状态。 
当客户端真正的ACK包到达时,有数据则转发给服务器,否则丢弃该包。 
[/quote:4f5b7f8414]

参见OpenBSD中pf的synproxy动作,例如:
pass in on $ext_if proto tcp from any to $web_server port www flags S/SA synproxy state

 bingocn 回复于:2004-05-31 10:37:11
[quote:728baca617="弱智"]purge觉得这是一个方法,思路的问题。以前看到过这样的讨论。

比如,可以这样:

做防火墙的机子收到客户端的SYN包时,直接转发给服务器;

然后,收到服务器回应的SYN/ACK包后,一方面将SYN/ACK包转发给客户..........[/quote:728baca617]

也不稳妥吧。
SYN半连接DOS,不是看消耗的资源多不多,而是到一定半连接数量时,服务器就不会接受SYN请求,这样来做到DOS,这个时候服务器资源占用的并不多。但你提出的完成握手,这样的话,系统很快可能达到进程/线程上限,整个系统的资源将有可能耗尽,比上一种情况更危险。
我是这么理解的 :)

 q1208c 回复于:2004-05-31 10:46:03
如果是正常的SYN是没办法的,因为,你总不能不让别人用吧?

如果是非正常的SYN,好象有办法吧?

 andyliu 回复于:2004-05-31 11:02:02
[quote:211744e0ba="弱智"]purge觉得这是一个方法,思路的问题。以前看到过这样的讨论。

比如,可以这样:

做防火墙的机子收到客户端的SYN包时,直接转发给服务器;

然后,收到服务器回应的SYN/ACK包后,一方面将SYN/ACK包转发给客户..........[/quote:211744e0ba]

问题是,怎么实现。如果把所有的SYN包现交给firewall,firewall又如何判别哪个包是合法的,哪些是不合法的。如果firewall无法判别,那垮掉的虽然不是apache server,但一定会使firewall,造成的损失更严重不是吗。

 JohnBull 回复于:2004-05-31 13:11:42
如果不从根本上修改TCP协议,TCP的SYN_FLOOD根本无法预防!
参见:
http://bbs.chinaunix.net/forum/viewtopic.php?t=23116&highlight=JohnBull

现在在Liunx平台上可以考虑用SCTP取代TCP.

 xichen 回复于:2004-05-31 14:18:27
对于syn攻击,有几种方法可以防御。
1、最有效的,增加带宽,做集群。
2、使用基于状态的防火墙,也就是以上各位说的三次握手。
3、从交换机上监听网络上的syn数据,当发送了syn包到服务器后,该地址一定时间内没有继续发送剩下的两个包。程序就冒充改ip和端口发送端开的IP包。

不能通过shell来解决,因为攻击者的IP和端口都是假冒的。

freebsd有非官方的解决方法,对dos有效,但是对ddos无法抵抗。
对于提供网络服务的话,我建议大家使用freebsd系统,毕竟是血统最纯正的unix系统,而且运算速度和网络响应速度比linux要高。

 platinum 回复于:2004-05-31 14:54:58
我那天用的那个攻击软件,是用真IP进行攻击的,netstat -an看到的是我的私网IP地址

另外“程序就冒充改ip和端口发送端开的IP包”这句不是很明白……

 JohnBull 回复于:2004-06-01 10:30:48
[quote:0ef8bba623="xichen"]对于syn攻击,有几种方法可以防御。
1、最有效的,增加带宽,做集群。
2、使用基于状态的防火墙,也就是以上各位说的三次握手。
3、从交换机上监听网络上的syn数据,当发送了syn包到服务器后,该地址一定时间内没..........[/quote:0ef8bba623]

别想了.
SCO公司大不大?APPLE公司大不大?MICROSOFT大不大?
那样的带宽和集群一样被DOS.所以增加带宽太被动了.
基于状态的防火墙也属骗人.参见我上面的引文.
交换机假冒握手更是掩耳盗铃的馊主意.殊不知一个进程可以同时打开的文件描述符有上限乎?你知道FreeBSD系统下的一个进程最多可以打开多少文件吗?那样不过是把第4层的DOS变成了第7层的DOS而已.

这一切的根本原因在于当初设计TCP/IP的时候,没有想到现在的网络环境这么复杂,没有预先充分地预防.
等SCTP取代了TCP后,这个问题就好多了.

 platinum 回复于:2004-06-01 10:41:17
看来只能“改善”,不能“根治”,除非不用TCP

 zjnet1 回复于:2004-06-01 11:11:03
[quote:0da99c6f5f="xichen"]对于syn攻击,有几种方法可以防御。
1、最有效的,增加带宽,做集群。
2、使用基于状态的防火墙,也就是以上各位说的三次握手。
3、从交换机上监听网络上的syn数据,当发送了syn包到服务器后,该地址一定时间内没..........[/quote:0da99c6f5f]

以apache服务为例:
比较赞同这种说法的:
1.用硬件防火墙,(觉得这是最主要的手段)
2.用硬件均衡负载设备,如 Alton,load director等;
3.apache集群;
4.限制apache服务的参数,最高CPULimit,和MemLimit,限制最长URL,限制最大bodyrequest。apache里面也做了不少能够防止DoS的工作的,大家见仁见智根据自己的机器配置进行配置。

从安全和性能之间取一个平衡。

 xichen 回复于:2004-06-01 12:10:20
[quote:6d679365af="platinum"]我那天用的那个攻击软件,是用真IP进行攻击的,netstat -an看到的是我的私网IP地址

另外“程序就冒充改ip和端口发送端开的IP包”这句不是很明白……[/quote:6d679365af]

错字,是断开。现在好点的交换机都有监听端口,能听到交换机里面的所有传输数据。在这里保留这个交换机所有的syn包的状态,一般来说,三次握手的延时不会超过5秒,但是对于旧内核的linux,这个超时时间最长能达到大约5天。
那么可以在超过5秒还没有接收到后续的两个包的时候,可以发送RST(记不清楚是否是这个包了)包,来让被dos攻击的服务器认为客户端已经断开了连接,从而释放了这个连接。
当然ddos攻击是任何系统任何设备都无法抵挡的,我们能做的只是让系统尽量的抵御攻击。
还有,现在高手门已经通过将一个syn包分解为多个IP包的方式来穿越防火墙,这个包不会被普通防火墙所识别,但是却能在系统内核重组成一个完成的syn包来达到攻击目的。

关于源地址和端口号发生变化,这是一般dos工具都具备的,你可以参考网卡的RAW(混杂)工作模式。欣慰的是一般ISP的路由器都不允许不属于这个网段的IP包的通过。给我们查找攻击者带来方便,并从一定程度上阻碍了dos攻击

 JohnBull 回复于:2004-06-01 13:10:29
[quote:ebe9071145="xichen"]
那么可以在超过5秒还没有接收到后续的两个包的时候,可以发送RST(记不清楚是否是这个包了)包,来让被dos攻击的服务器认为客户端已经断开了连接,从而释放了这个连接。
[/quote:ebe9071145]
RST没用的,应该FIN.
但这么做与SYN COOKIE或者六次握手从效果上有什么本质区别呢?况且你还得要求交换机有SPAN口以及增加新设备.

[quote:ebe9071145="xichen"]
还有,现在高手门已经通过将一个syn包分解为多个IP包的方式来穿越防火墙,这个包不会被普通防火墙所识别,但是却能在系统内核重组成一个完成的syn包来达到攻击目的。
[/quote:ebe9071145]
这个方法也早就过时了,现在Linux防火墙能搞定这种攻击,不知FreeBSD\行否.

[quote:ebe9071145="xichen"]
关于源地址和端口号发生变化,这是一般dos工具都具备的,你可以参考网卡的RAW(混杂)工作模式。欣慰的是一般ISP的路由器都不允许不属于这个网段的IP包的通过。给我们查找攻击者带来方便,并从一定程度上阻碍了dos攻击[/quote:ebe9071145]
网卡的混杂模式是作用于接收报文的时候,与发送无关. 而RAW是TCP/IP套接字的一种工作模式,与网卡无关.路由器也不能得知一个数据包里面的传输层会话在端系统上究竟是什么方式打开的.

我没有别的意思,只是想说TCP半连接洪水是没有办法的,不要再误导初学者了,凡声称在不修改TCP的情况下解决了SYN FLOOD问题的软/硬件厂家都是骗子,跟大街上的一针根治牛皮癣广告一样.很多人片面强调DoS与DDoS的差异,其实二者技术本质没有差异!你提到的那些方法,都可以有针对性地进行反制.

 platinum 回复于:2004-06-01 13:20:06
如果这样,网络中的服务不就没有任何安全可言了吗,想让谁OVER谁就OVER

 q1208c 回复于:2004-06-01 13:30:10
我想楼上的大哥说的有点问题,sco, m$, apple 是被DDoS攻击了吧?DoS还是有办法的吧?

 platinum 回复于:2004-06-01 13:38:30
DOS有办法,DDOS没办法
我就是想知道DOS的解决办法,但现在有点搞不清DOS和DDOS的区别了……

 fushuyong 回复于:2004-06-01 13:44:33
这个是没有办法彻底的防止的,这本身就是TCP协议的设计“缺陷”,只能通过变通的方法来提高系统抵御半开连接的能力。

 xichen 回复于:2004-06-01 14:40:54
JohnBull可能有点误解我的意思了,RAW工作模式是我在描述如何用编程方法来实现假冒IP和端口。
路由器因为禁止了非本网段IP地址的通过,一个是容易查出攻击者,一个是使产生的syn包的数量减少了。

 弱智 回复于:2004-06-01 15:18:13
其实,这就是利用了tcp/ip协议的漏洞,JohnBull兄说的没错。
purge的想法的确比较天真,在现有的条件下最好的办法也就是那么几种,
purge曾看到说甚至临时换ip,把web服务临时转到新的ip上去。

 daixi 回复于:2004-06-01 17:05:24
最近正在学习此类东西,帮忙顶一下吧。
不过,我觉得SYN Flood还是比较难防范的。
我测试过一个我自己的程序,我伪造SYN数据包发送到某个地址,均能接收到ACK回复。似乎这个问题,比较头痛的问题。。。。

 好好先生 回复于:2004-06-01 17:17:44
感觉这个问题很好,让我也学了不少东西。大家继续,我搬个凳子来学习…… :em02:

 fushuyong 回复于:2004-06-01 18:21:08
连Whitehouse碰到这种情况也只能启动最高安全方案,拔网线。。。。。

 platinum 回复于:2004-06-01 18:26:41
[quote:8113121d88="fushuyong"]连Whitehouse碰到这种情况也只能启动最高安全方案,拔网线。。。。。[/quote:8113121d88]
真的假的?

 xichen 回复于:2004-06-02 11:39:09
[quote:b28ff313c1="fushuyong"]连Whitehouse碰到这种情况也只能启动最高安全方案,拔网线。。。。。[/quote:b28ff313c1]

假的!!

 chjcpu1 回复于:2004-06-03 15:35:31
我想请教一下,我是学校的网管,看到各位前辈在此讨论不禁试了一下,下载了一个HGOD的软件,按照说明仅简单的一试服务器就不能响应服务了,如此这样,学生搞恶作具的心理更强,我乞不要哭死。

 xichen 回复于:2004-06-03 17:39:43
hgod的攻击能力比较强,而且他对自己机器的cpu消耗率比较底。

 iceblood 回复于:2004-06-03 22:28:24
这本来就是TCP/IP协议设计上的缺陷,正如上面一个人说的,现在真的是想让哪个网站over,哪个就要over。只是看人的数量。不过绿盟的黑洞也确实很不错,原因就是修改了TCP/IP协议上的处理,优化的其中的算法。但如果不这么做,以一般的TCP/IP协议是绝对不可能防止syn_flood的。而且synflood越来越先进,以前还只是真实的IP在synflood,后来发展到假冒IP,然后到现在的随机IP,也就是所有syn_flood的连接没有一个重复的,而且全是假的,真可谓的“科技进步”。所以以前的那些防止synflood攻击的手法全都失效。唯一能解决的或许就是修改TCP/IP。但不知道状态检测到底如何,假如建立一个连接一般都是在那一瞬间,而防火墙就直接检查每个TCP/IP连接的状态,如果发现连接过程不完整就立刻阻断。

 chjcpu1 回复于:2004-06-04 12:01:06
不说别的我用的hgod就是用假ip攻击的,用netstate -an 查看500多条假的,如果是恶意攻击,你可能无从查起,没办法!!!!

 platinum 回复于:2004-06-04 12:15:23
我就晕~!
如此说来,sina、163、sohu等门户网站都可以在瞬间就完蛋?

 jackylau 回复于:2004-07-31 20:24:07
[quote:26bfd7b43c="platinum"]我就晕~!
如此说来,sina、163、sohu等门户网站都可以在瞬间就完蛋?[/quote:26bfd7b43c]
9494!帮你顶吧!

 找工作ing 回复于:2004-12-28 09:40:25
up

 双眼皮的猪 回复于:2004-12-28 10:32:12
这些大型网站,方法syn-flood应该还是有一套的,假如在一下收到十多条syn,而第三次握手没收到ack的话,你就被断了...

建议看看这里:
http://blog.csdn.net/lalphbet/archive/2004/12/23/226298.aspx

 hutuworm 回复于:2004-12-28 10:37:36
[quote:2e264bb901="platinum"]我就晕~!
如此说来,sina、163、sohu等门户网站都可以在瞬间就完蛋?[/quote:2e264bb901]

这要看攻击者有多大的能力调动足够的带宽去攻击
以三大门户的现有带宽以及他们和上级ISP的关系
一次持续的攻击有可能被抓到
短暂的攻击也没什么意义
因此普通攻击者也不会贸然犯险

 simonzhan 回复于:2004-12-28 14:56:55
正是,我记得上次白宫那档子事最后好象是通过更换IP来解决的?

 虚度光阴 回复于:2004-12-28 23:10:53
DOS是一种利用单机的攻击方式,而DDos(分布式拒绝服务)是一种基于DOS的特殊形式的拒绝服务攻击,和DOS比就是一个是多点,一个是单点

预防为主  保证安全

1定期扫描:(安全漏洞)
2在骨干节点配置放火墙,防火墙本身能抵御DDOS攻击和其他一些攻击,在发现受攻击的时候,可以将攻击导向其他一些牺牲主机,保证真正的主机不受瘫痪
3用足够的机器承受黑客攻击,因为黑客在攻击你的同时,自己的能量也在逐渐消失,想想为什么GOOGLE MICROSOFT SINA为什么WEB都有集群结构或分布式DNS
4过滤不必要的服务和端口(一个原则是满足最基本需要)
5检查访问者的来源,可以把那个IP段或域禁止
6应该过滤所有私网地址 192.168.0.    10.     172.16.
7限制SYN/ICMP流量 最好把PING关掉

 虚度光阴 回复于:2004-12-28 23:12:04
对了 忘了告诉各位一件事情 

安全问题是 ing形式  不是ed形式


bestregard

 7758 回复于:2004-12-29 14:22:33
总的来说小型的服务器和网站还是没什么办法抵御的,只能做一些杯水车薪的事

原文转自:http://www.ltesting.net