|
互联网如同现实社会一样充满钩心斗角,网站被DDOS也成为站长最头疼的事。在没有硬防的情况下,寻找软件代替是最直接的方法,比如用 iptables,但是iptables不能在自动屏蔽,只能手动屏蔽。 一、什么是DDOS攻击? DDoS也就是分布式拒绝服务攻击。它使用与普通的拒绝服务攻击同样的方法,但是发起攻击的源是多个。通常攻击者使用下载的工具渗透无保护的主机,当获得该主机的适当的访问权限后,攻击者在主机中安装软件的服务或进程(以下简侈怔理)。这些代理保持睡眠状态,直到从它们的主控端得到指令,对指定的目标发起拒绝服务攻击。 二、如何确认自己受到DDOS攻击? 在系统上执行: netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
% i7 D9 D7 w/ K, Z! e3 `7 @执行后,将会显示服务器上所有的每个IP多少个连接数。
3 m! y, z1 w9 m- |3 ]; w6 V以下是我自己用VPS测试的结果:
- n4 v; v2 W! ?li88-99:~# netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n) P8 p2 ?$ m& Q' T3 M
1 114.226.9.132
, r& K, f0 C* j0 p8 {1 174.129.237.157& O/ C) z# _" @2 O* \$ L
1 58.60.118.142
% m: ~# F0 o+ d0 F1 Address2 P) Y* V1 [8 o+ C9 Y1 ?
1 servers)
y2 | B8 E S! k2 118.26.131.78
2 i# ?( h2 H/ `) f- H: H3 123.125.1.202 Y2 I6 n6 m' P: t
3 220.248.43.1190 I: J8 X' _. A, S
4 117.36.231.253
- W+ Q/ O0 f5 d2 e: ~4 119.162.46.124& L4 D' l: u5 |" m; X, ^
6 219.140.232.128) _" K7 p% r8 k* D& X/ [
8 220.181.61.31. ^* |$ c* E- f% V8 L/ a- F" L
2311 67.215.242.196
8 U2 @. R: y/ n" [* j; i每个IP几个、十几个或几十个连接数都还算比较正常,如果像上面成百上千肯定就不正常了。
' U9 g, |9 Y5 `% d 三、防范DDOS攻击的方法: 一些常用的防DDOS攻击的方法,罗列如下: 1.增加硬件防火墙和增加硬件设备来承载和抵御DDOS攻击,最基本的方法,但成本比较高。 2.修改SYN设置抵御SYN攻击:
3 r- y+ K! s1 `9 M5 \SYN攻击是利用TCP/IP协议3次握手的原理,发送大量的建立连接的网络包,但不实际建立连接,最终导致被攻击服务器的网络队列被占满,无法被正常用户访问。 Linux内核提供了若干SYN相关设置,使用命令:
5 D( o V, S8 M! ksysctl -a | grep syn [8 H( v& V$ q
看到:
! |3 \ n8 W+ o" t3 c* L; Unet.ipv4.tcp_max_syn_backlog = 1024! I: ^: r% L* ]! }3 _
net.ipv4.tcp_syncookies = 0
6 `8 C& O# G, o# z; x6 g: knet.ipv4.tcp_synack_retries = 5* O1 Q2 X; u2 ^
net.ipv4.tcp_syn_retries = 5 tcp_max_syn_backlog是SYN队列的长度,tcp_syncookies是一个开关,是否打开SYN Cookie5 @* Y% u# O4 f
功能,该功能可以防止部分SYN攻击。tcp_synack_retries和tcp_syn_retries定义SYN# [% O. H9 U% \) l
的重试次数。 加大SYN队列长度可以容纳更多等待连接的网络连接数,打开SYN Cookie功能可以阻止部分3 m& t/ l$ n( ]* J7 m
SYN攻击,降低重试次数也有一定效果。 调整上述设置的方法是:) b# y' u; D& x- t* l
增加SYN队列长度到2048:
0 z" ~; {) O. Z# h/ W9 @sysctl -w net.ipv4.tcp_max_syn_backlog=2048
P$ w# Q9 P$ a( K/ _# A打开SYN COOKIE功能:9 u( s5 F# n. M7 d) c
sysctl -w net.ipv4.tcp_syncookies=1
0 V' T$ U) e+ D降低重试次数:
# G8 b8 `) U' q8 x/ ?7 _& \sysctl -w net.ipv4.tcp_synack_retries=3 `) Y6 m( w9 ?& ]* m
sysctl -w net.ipv4.tcp_syn_retries=3 为了系统重启动时保持上述配置,可将上述命令加入到/etc/rc.d/rc.local文件中。 3.安装iptables对特定ip进行屏蔽。 A.安装iptables和系统内核版本对应的内核模块kernel-smp-modules-connlimit( @( P) n+ Q$ d" H; u/ T) H
B. 配置相应的iptables规则( ~# A: `, s2 r* {( m: V' w
示例如下: (1)控制单个IP的最大并发连接数
; Q7 e5 }1 x2 N- \# }2 h3 o2 a v6 h0 n3 @iptables -I INPUT -p tcp –dport 80 -m connlimit –connlimit-above 50 -j REJECT
+ h% f- L9 a C( O% ?#允许单个IP的最大连接数为 30! V- C, _* G7 U1 W/ }" |
(2)控制单个IP在一定的时间(比如60秒)内允许新建立的连接数! \7 q" v7 X: Q+ r9 _0 o. q3 Z
iptables -A INPUT -p tcp –dport 80 -m recent –name BAD_HTTP_ACCESS –update –seconds 60 \
6 N% A0 `! Y+ p( j! b8 x1 W- l: v–hitcount 30 -j REJECT
) `9 i/ @% M( p3 h: eiptables -A INPUT -p tcp –dport 80 -m recent –name BAD_HTTP_ACCESS –set -j ACCEPT
0 U4 p0 H1 c0 I; @2 o: y#单个IP在60秒内只允许最多新建30个连接 (3)用iptables屏蔽IP
( _* q, }, W; V! yiptables -I RH-Lokkit-0-50-INPUT 1 -p tcp -m tcp -s 213.8.166.227 --dport 80 --syn -j REJECT
% W& \3 E M3 h, w指定端口的参数是--dport 80;多了--syn参数,可以自动检测sync攻击* k; P; e. m# V/ J
(4)使用iptables禁止ping:
# F( r2 H8 V0 siptables -A INPUT -p icmp -m icmp --icmp-type 8 -m limit --limit 6/min --limit-burst 2 -j ACCEPT-A INPUT -p icmp -m icmp --icmp-type 8 -j REJECT --reject-with icmp-port-unreachable
: I g/ m, c# X5 E! U0 Z# @& q(5)允许某ip连接2 T. U# L; j; f5 a; V5 `
iptables -I RH-Firewall-1-INPUT 1 -p tcp -m tcp -s 192.168.0.51 --syn -j ACCEPT
7 L2 l" C7 k, ~* D1 bC. 验证: v2 o6 T" R' z( W, o; s) t, Y
(1)工具:flood_connect.c(用来模拟攻击)
) [6 }+ h: ^0 X9 s+ Z+ E(2)查看效果:
$ Y+ Z7 K& [' a8 G5 H3 e! @6 G使用 watch ‘netstat -an | grep:21 | \ grep< 模拟攻击客户机的IP>| wc -l’9 o8 x7 `0 [8 m* F
实时查看模拟攻击客户机建立起来的连接数,
7 t+ l3 x/ ^: z使用
7 i3 x2 {2 v8 N4 }9 a. Ywatch ‘iptables -L -n -v | \grep< 模拟攻击客户机的IP>’
9 |3 ?5 [# ~. q; ]8 ~查看模拟攻击客户机被 DROP 的数据包数。
; J) A' m* T) C' x1 JD.注意
1 s" R0 ~% n( `为了增强iptables防止CC攻击的能力,最好调整一下ipt_recent的参数如下:2 T6 u. `+ u8 j# k5 W, K7 n
#cat/etc/modprobe.conf, F/ W9 k% k9 n' r
options ipt_recent ip_list_tot=1000 ip_pkt_list_tot=60
/ c, F# f3 j! Y#记录1000个IP地址,每个地址记录60个数据包
! W5 O* n: L5 n6 t1 R3 e#modprobe ipt_recent E.可编写脚本自动提娶攻击ip然后自动屏蔽: */2 * * * * /usr/local/nginx/var/log/drop.sh #!/bin/sh) K) X7 w0 b" S3 K& d0 P
cd /usr/local/nginx/var/log
' ^9 ~3 w' F% T0 i( I7 Ptail access.log -n 1000 |grep vote.php | |sort |uniq -c |sort -nr |awk '{if ($2!=null && $1>50)}' > drop_ip.txt
+ [% o E. N9 W {2 ]% B/ ~for i in `cat drop_ip.txt`
1 m: e8 D0 x: `% t( _do" r8 }* h, g `3 v) ?- a. `
/sbin/iptables -I INPUT -s $i -j DROP;) ^) ^9 m w1 B* l
done) i6 r4 _. S, v4 P+ o V
这shell 每几分钟执行一次,就可自动屏蔽那些不正常IP,相信大家都看的懂,下面是针对连接数屏蔽代码 #!/bin/sh1 {9 U# e% p) b# I& q# f+ R2 O: t
/bin/netstat -ant |grep 80 |awk '{print $5}' |awk -F : '{print $1}' |sort |uniq -c |sort -rn |grep -v -E '192.168|127.0' |awk '{if ($2!=null && $1>50)}' > drop_ip.txt F5 A7 S% e" j8 `/ ?4 p* [
for i in `cat drop_ip.txt`
$ \' y: [/ w* a# _do3 m5 v j0 Q7 J3 i4 ^* b5 p: u3 W/ n
/sbin/iptables -I INPUT -s $i -j DROP;
3 N. H3 L6 k% F4 T5 x0 B9 y; |, B& mdone
+ u: g; W7 h2 _说下,grep -v -E '192.168|127.0' 也就是排除内网IP,免得把自己给屏蔽了,当然还可以加些自己的IP。 4.安装DDoS deflate自动抵御DDOS攻击: DDoS deflate是一款免费的用来防御和减轻DDoS攻击的脚本。它通过netstat监测跟踪创建大量网络连接的IP地址,在检测到某个结点超过预设的限制时,该程序会通过APF或IPTABLES禁止或阻挡这些IP. DDoS deflate官方网站: (1)安装DDoS deflate wget( R, }4 ]0 A. O; Q
chmod 0700 install.sh //添加权限
3 ]3 P+ Z D/ U9 F./install.sh //执行 (2)配置DDoS deflate 下面是DDoS deflate的默认配置位于/usr/local/ddos/ddos.conf ,内容如下: ##### Paths of the script and other files4 f c: i7 X( d% F
PROGDIR=”/usr/local/ddos”; w2 S; B) ]" O/ x: A R$ _
PROG=”/usr/local/ddos/ddos.sh”. r% _0 |2 P( c* E, c5 P
IGNORE_IP_LIST=”/usr/local/ddos/ignore.ip.list” //IP地址白名单
: x3 \ Z) R- @; |CRON=”/etc/cron.d/ddos.cron” //定时执行程序
# s' `8 K. i: a# [# Y- G4 DAPF=”/etc/apf/apf”
8 v& D$ N+ K: r |; U. p: NIPT=”/sbin/iptables” ##### frequency in minutes for running the script$ m+ J- s( ~; k' `+ {
##### Caution: Every time this setting is changed run the script with –cron: d# g9 `. W" n3 V
##### option so that the new frequency takes effect
% X8 \; u1 }( _" p2 QFREQ=1 //检查时间间隔,默认1分钟 ##### How many connections define a bad IP? Indicate that below.* m( F% \+ W, v' ^9 C
NO_OF_CONNECTIONS=150 //最大连接数,超过这个数IP就会被屏蔽,一般默认即可 ##### APF_BAN=1 (Make sure your APF version is atleast 0.96)
) \$ R9 B8 p. l& M) V. X; b* @##### APF_BAN=0 (Uses iptables for banning ips instead of APF)
- v% ?0 |' [# W9 YAPF_BAN=1 //使用APF还是iptables,推荐使用iptables ##### KILL=0 (Bad IPs are’nt banned good for interactive execution of script)9 |/ F" s) T# e; V, @8 L7 h
##### KILL=1 (Recommended setting)
/ H p( ?/ @. K4 EKILL=1 //是否屏蔽IP,默认即可 #### An email is sent to the following address when an IP is banned.
, ^) m& X4 q4 s7 ` m# L% e##### Blank would suppress sending of mails" R. D. z2 i3 H0 J1 L3 u
EMAIL_TO=”root” //当IP被屏蔽时给指定邮箱发送邮件,推荐使用,换成自己的邮箱即可 ##### Number of seconds the banned ip should remain in blacklist.
8 H" ? k" H0 [5 Z, rBAN_PERIOD=600 //禁用IP时间,默认600秒,可根据情况调整 用户可根据给默认配置文件加上的注释提示内容,修岗?置文件。 喜欢折腾的可以用Web压力测试软件(《web服务器性能/压力测试工具http_load、webbench、ab、Siege使用教程》)测试一下效果,这东西只能防御小流量的攻击了,聊胜于无吧。 5.APACHE上安装mod_evasive 组件增强抵御力 mod_evasive是一个预防Apache 遭受DDos 攻击的模块,可以防止同一个IP 对相同URI 发出的大量请求,可设定的选项有:# d2 V0 ]: z( L8 Z$ v. ?
– 限制同一个IP 在一定秒数内请求一个页面或档案的次数。
& z$ _# C. z3 g- R! P– 限制同一个IP 一秒内只可发出50 个请求。, U& f: `& [7 K' Y' v7 u
– 设定被禁止的 IP 封锁时间。
8 V- O' G; `" ~1 Y9 v E以下是 mod_evasive 的安装方法:
A. 先将原来的 httpd.conf 备份起来。
( n2 _& B: E2 F! l/ x; G, a B. 到 C. 在指令模式解压及编译 mod_evasive: tar zxvf mod_evasive_1.10.1.tar.gz
1 w" B2 H: {( `cd mod_evasive/
3 Q2 N( _0 a# wapxs -cia mod_evasive20.c
8 W! S- O( `' ]& ^1 y' \- G以上的apxs 会放在Apache 的bin 目录内;如果Apache 版本是1.3 的话,指令要改为: apxs -cia mod_evasive.c
3 ~/ [0 |4 c, P1 @" A安装好mod_evasive 后,便要修改httpd.conf 内容。 D. 开启 httpd.conf,加入以内容: DOSHashTableSize 3097
\. @1 a" A3 hDOSPageCount 5 Y& l; S0 I, d7 c: @4 u/ O; h5 k
DOSSiteCount 100
* d f2 `! W+ J; o& a c, |DOSPageInterval 2
9 g# d+ [% R8 hDOSSiteInterval 2
, z% W3 K: _0 t7 y8 W5 E$ ?DOSBlockingPeriod 108 E' b" B) U" ^% Q
DOSBlockingPeriod 600 DOSHashTableSize — 这是占用内存的大小,如果服务器比较繁忙,这个数值要设定大一点。
h, H1 |* T7 D# u, `3 g, CDOSPageCount — 同一IP 在一个时段内可以存娶同一页面的次数,超过会被禁止。( |$ j) c2 a( ?/ M
DOSSiteCount — 同一IP 在一个网站内可以占用多少object,超过会禁止。0 P8 }5 _: u# F5 w; O& d
DOSPageInterval — DOSPageCount 内的时段设定。' q+ I3 W$ \1 X, V8 b
DOSSiteInterval — DOSSiteCount 的时间设定,以秒为单位。
8 b x8 D+ k! }1 TDOSBlockingPeriod — 当发现疑似攻击后,使用者会收到403 Forbidden,这是设定封锁的时间,以秒为单位。 E. 最后重新启动 Apache 即可。 ) h0 O' O0 t" b$ S: J$ Q: x8 ]
|