|
互联网如同现实社会一样充满钩心斗角,网站被DDOS也成为站长最头疼的事。在没有硬防的情况下,寻找软件代替是最直接的方法,比如用 iptables,但是iptables不能在自动屏蔽,只能手动屏蔽。 一、什么是DDOS攻击? DDoS也就是分布式拒绝服务攻击。它使用与普通的拒绝服务攻击同样的方法,但是发起攻击的源是多个。通常攻击者使用下载的工具渗透无保护的主机,当获得该主机的适当的访问权限后,攻击者在主机中安装软件的服务或进程(以下简侈怔理)。这些代理保持睡眠状态,直到从它们的主控端得到指令,对指定的目标发起拒绝服务攻击。 二、如何确认自己受到DDOS攻击? 在系统上执行: netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
2 R/ [, N; |. M- A, q' x9 F: r执行后,将会显示服务器上所有的每个IP多少个连接数。
; S. P' f: d" d; H( @; O以下是我自己用VPS测试的结果:1 v" R* I) C/ q2 _, C4 i4 x
li88-99:~# netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n& e1 W4 @, O( M7 V- H: u
1 114.226.9.132! o. N. h! w/ @6 z& t9 S" J
1 174.129.237.1578 R1 y: Z0 Y2 ~
1 58.60.118.1420 u5 T& [/ |/ z) s, {- u
1 Address! j. J$ r6 s$ W k( M/ `( g1 T
1 servers)
7 x2 l6 X) o& _! L: A1 ~% d8 _2 118.26.131.78
$ r K2 @/ C5 _; i& ?! O$ b3 123.125.1.202* m! Z7 P) c6 H6 b: E7 ?# P
3 220.248.43.1192 `# }7 e2 D$ c! w
4 117.36.231.253$ Q5 P, ^4 e; F# y* X
4 119.162.46.124
( J- Z/ ^ O4 H0 L3 z: c( m6 219.140.232.128
8 q# s T, n$ ~& `6 n8 220.181.61.31) r" R: _ r5 j" a& e: H
2311 67.215.242.196
3 {+ U8 [% {# c l# N! ^每个IP几个、十几个或几十个连接数都还算比较正常,如果像上面成百上千肯定就不正常了。- D9 y2 u- X, C: m
三、防范DDOS攻击的方法: 一些常用的防DDOS攻击的方法,罗列如下: 1.增加硬件防火墙和增加硬件设备来承载和抵御DDOS攻击,最基本的方法,但成本比较高。 2.修改SYN设置抵御SYN攻击:: J/ b5 M ]8 X0 o5 P: o
SYN攻击是利用TCP/IP协议3次握手的原理,发送大量的建立连接的网络包,但不实际建立连接,最终导致被攻击服务器的网络队列被占满,无法被正常用户访问。 Linux内核提供了若干SYN相关设置,使用命令:4 f3 C: _/ q# |: ^$ z5 \
sysctl -a | grep syn
) F$ @9 i+ O5 G1 Y- b5 |2 d看到:7 z: m- b6 b( \/ G: I
net.ipv4.tcp_max_syn_backlog = 1024, Q2 c3 R; a; ]$ @- O2 a: Y+ X
net.ipv4.tcp_syncookies = 0
& [$ N8 o' Z/ hnet.ipv4.tcp_synack_retries = 5
* g4 u# O# y! ^# }' F C* w9 B5 R! fnet.ipv4.tcp_syn_retries = 5 tcp_max_syn_backlog是SYN队列的长度,tcp_syncookies是一个开关,是否打开SYN Cookie+ A8 j( Y% ~4 i( k4 w+ z! k9 N
功能,该功能可以防止部分SYN攻击。tcp_synack_retries和tcp_syn_retries定义SYN
/ p- f4 i! H" m, g, O9 P的重试次数。 加大SYN队列长度可以容纳更多等待连接的网络连接数,打开SYN Cookie功能可以阻止部分
8 `/ H9 I% P+ x# `3 sSYN攻击,降低重试次数也有一定效果。 调整上述设置的方法是:
~$ a: \) x$ G1 A* ^2 m; u" C8 k n9 A增加SYN队列长度到2048:
) V2 p# k; R R2 psysctl -w net.ipv4.tcp_max_syn_backlog=2048$ u# K/ P& H) p9 ^6 t$ y) i
打开SYN COOKIE功能:1 u \2 R& c5 N
sysctl -w net.ipv4.tcp_syncookies=1
h& |- @; ^2 l# \3 |$ m- }* w降低重试次数: F5 X. c' e4 ?' ^
sysctl -w net.ipv4.tcp_synack_retries=3: i) \7 I3 t6 a5 M8 K
sysctl -w net.ipv4.tcp_syn_retries=3 为了系统重启动时保持上述配置,可将上述命令加入到/etc/rc.d/rc.local文件中。 3.安装iptables对特定ip进行屏蔽。 A.安装iptables和系统内核版本对应的内核模块kernel-smp-modules-connlimit
/ F; k8 s6 G; f" ?6 F+ TB. 配置相应的iptables规则
! r* P- j- p& j) s( [' X3 H9 U! B" G2 H示例如下: (1)控制单个IP的最大并发连接数# g+ m; X* }' D& v) `' M
iptables -I INPUT -p tcp –dport 80 -m connlimit –connlimit-above 50 -j REJECT7 g1 w9 I+ N6 ]( ?) M# ^
#允许单个IP的最大连接数为 308 c7 r2 |6 m: E4 E- L {
(2)控制单个IP在一定的时间(比如60秒)内允许新建立的连接数; K! k, A) m0 M
iptables -A INPUT -p tcp –dport 80 -m recent –name BAD_HTTP_ACCESS –update –seconds 60 \
# Q# R4 p$ R9 [' Y% O0 x& K–hitcount 30 -j REJECT% C" [' u0 t7 o; P' P! W
iptables -A INPUT -p tcp –dport 80 -m recent –name BAD_HTTP_ACCESS –set -j ACCEPT
I- e+ \- \* r$ g I/ H, ]#单个IP在60秒内只允许最多新建30个连接 (3)用iptables屏蔽IP
% a- ^7 ~+ r; u* y4 fiptables -I RH-Lokkit-0-50-INPUT 1 -p tcp -m tcp -s 213.8.166.227 --dport 80 --syn -j REJECT
8 r5 }3 z* u+ v3 J) B7 |% E指定端口的参数是--dport 80;多了--syn参数,可以自动检测sync攻击
9 [# R8 d( Q: n0 v9 Z(4)使用iptables禁止ping:
. A5 K0 S3 p7 N+ C7 D4 ciptables -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( @( ?3 s6 C9 t* |8 m7 Z: @: W
(5)允许某ip连接
0 c( g/ b2 `' }& k% ?iptables -I RH-Firewall-1-INPUT 1 -p tcp -m tcp -s 192.168.0.51 --syn -j ACCEPT
0 @3 {7 v3 y9 i* I- `4 C' GC. 验证- F" i' n$ ~& i9 l: d
(1)工具:flood_connect.c(用来模拟攻击)- Z5 I4 ^' Z- V* D: R. I) O
(2)查看效果:+ C8 q( m2 c# B$ w' b: j
使用 watch ‘netstat -an | grep:21 | \ grep< 模拟攻击客户机的IP>| wc -l’
1 O- U% i* \% _/ N$ k实时查看模拟攻击客户机建立起来的连接数," j) [% E6 T2 _, v7 R% k7 U
使用
% k1 u3 d+ g# n% } Zwatch ‘iptables -L -n -v | \grep< 模拟攻击客户机的IP>’
1 J T) p. A+ c查看模拟攻击客户机被 DROP 的数据包数。" F) O9 D/ {! S( k& t0 c$ I0 ~
D.注意
8 `$ `. l F# f- e为了增强iptables防止CC攻击的能力,最好调整一下ipt_recent的参数如下:* H! p( H2 B6 i
#cat/etc/modprobe.conf
9 X7 `. r1 ?2 X( W+ Eoptions ipt_recent ip_list_tot=1000 ip_pkt_list_tot=60( T2 S/ G6 X# ], K5 R# n, C
#记录1000个IP地址,每个地址记录60个数据包
n" w: {9 t5 |#modprobe ipt_recent E.可编写脚本自动提娶攻击ip然后自动屏蔽: */2 * * * * /usr/local/nginx/var/log/drop.sh #!/bin/sh( J: n( R, l' T1 S3 K- P# N
cd /usr/local/nginx/var/log
1 B, q# }! j4 o) ?9 w, M9 o/ q' rtail access.log -n 1000 |grep vote.php | |sort |uniq -c |sort -nr |awk '{if ($2!=null && $1>50)}' > drop_ip.txt" T2 e0 m* o9 u- ~
for i in `cat drop_ip.txt`
: @: t4 Z' ^. b& g& e% g3 b# mdo2 U3 Q. Q( |9 F( }/ d& ~
/sbin/iptables -I INPUT -s $i -j DROP;
& T; d# K z/ E4 r3 Rdone6 }: N6 @* w% |* h2 c3 k
这shell 每几分钟执行一次,就可自动屏蔽那些不正常IP,相信大家都看的懂,下面是针对连接数屏蔽代码 #!/bin/sh8 s; b) S' V4 R2 t; A4 ?+ v: g
/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
{3 y- O T. U& ^for i in `cat drop_ip.txt`; [# G: a/ Y; r
do
4 y9 c* A* A2 q/sbin/iptables -I INPUT -s $i -j DROP;
* t, r( a B# z; M E; x9 k( E Gdone
7 Y" {5 x' B. m. |/ e) _% D1 X D说下,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
+ U; l/ F' x7 l/ m: t- X: ichmod 0700 install.sh //添加权限
2 z0 E1 k# P1 a6 R$ Z./install.sh //执行 (2)配置DDoS deflate 下面是DDoS deflate的默认配置位于/usr/local/ddos/ddos.conf ,内容如下: ##### Paths of the script and other files5 T0 y& {6 c/ Z
PROGDIR=”/usr/local/ddos”
+ I. o9 o# {! l4 v' ]* hPROG=”/usr/local/ddos/ddos.sh”1 Q& f, q: D N3 d* k# r1 i$ o" y- f
IGNORE_IP_LIST=”/usr/local/ddos/ignore.ip.list” //IP地址白名单
6 v6 }) o$ r' v4 D8 f1 f+ fCRON=”/etc/cron.d/ddos.cron” //定时执行程序5 @$ s: B% L) o3 P/ O8 Z
APF=”/etc/apf/apf”
1 F9 u6 G1 q- ` ]" x. J0 QIPT=”/sbin/iptables” ##### frequency in minutes for running the script. ~3 s7 G0 N, R9 o! L
##### Caution: Every time this setting is changed run the script with –cron
- J& Q# _6 x; }- M3 s6 U, ~##### option so that the new frequency takes effect- b* F2 [1 `2 a$ ]# N- S: s
FREQ=1 //检查时间间隔,默认1分钟 ##### How many connections define a bad IP? Indicate that below.
) P5 U9 {% Z0 d! o8 h. Y- L. {NO_OF_CONNECTIONS=150 //最大连接数,超过这个数IP就会被屏蔽,一般默认即可 ##### APF_BAN=1 (Make sure your APF version is atleast 0.96)
- G% t3 b9 m9 c0 y8 e _: ~##### APF_BAN=0 (Uses iptables for banning ips instead of APF)
5 W5 G/ l0 n6 F$ A9 w' pAPF_BAN=1 //使用APF还是iptables,推荐使用iptables ##### KILL=0 (Bad IPs are’nt banned good for interactive execution of script)
- V) X- p- v9 z8 a6 g3 ^##### KILL=1 (Recommended setting)
! w- W& Z6 z# N8 G' [& \* h. aKILL=1 //是否屏蔽IP,默认即可 #### An email is sent to the following address when an IP is banned.: y" v" A# _* G
##### Blank would suppress sending of mails
& @/ N' L, E+ F5 _EMAIL_TO=”root” //当IP被屏蔽时给指定邮箱发送邮件,推荐使用,换成自己的邮箱即可 ##### Number of seconds the banned ip should remain in blacklist.
/ x9 e( R, ~2 q) bBAN_PERIOD=600 //禁用IP时间,默认600秒,可根据情况调整 用户可根据给默认配置文件加上的注释提示内容,修岗?置文件。 喜欢折腾的可以用Web压力测试软件(《web服务器性能/压力测试工具http_load、webbench、ab、Siege使用教程》)测试一下效果,这东西只能防御小流量的攻击了,聊胜于无吧。 5.APACHE上安装mod_evasive 组件增强抵御力 mod_evasive是一个预防Apache 遭受DDos 攻击的模块,可以防止同一个IP 对相同URI 发出的大量请求,可设定的选项有:, b2 [. U2 x, X" a2 v
– 限制同一个IP 在一定秒数内请求一个页面或档案的次数。
6 {2 }9 b: n7 f* ~* T* Y1 ^– 限制同一个IP 一秒内只可发出50 个请求。
5 ^, l, O, B6 ]! _' V& A* L– 设定被禁止的 IP 封锁时间。
7 Y4 ~8 e$ c, _+ ?- k/ E1 k5 S2 e以下是 mod_evasive 的安装方法:
A. 先将原来的 httpd.conf 备份起来。
% G- @+ H3 w( P6 p! T5 L4 h B. 到 C. 在指令模式解压及编译 mod_evasive: tar zxvf mod_evasive_1.10.1.tar.gz
" X b+ |+ f" {, Y& {cd mod_evasive/. L* V6 I$ j# O; a: |& s8 J
apxs -cia mod_evasive20.c
w/ n& s! ?2 l3 m以上的apxs 会放在Apache 的bin 目录内;如果Apache 版本是1.3 的话,指令要改为: apxs -cia mod_evasive.c
Z9 l, Q7 c4 z6 f2 o6 `, l安装好mod_evasive 后,便要修改httpd.conf 内容。 D. 开启 httpd.conf,加入以内容: DOSHashTableSize 30973 [. Z" H* b% m, J) S; E! Z2 |
DOSPageCount 5
9 C% L Z& Q- W8 ODOSSiteCount 100
1 J8 { r! b- Y; j: ]( T" _$ ?DOSPageInterval 2
. i2 S! x! w( v! t2 RDOSSiteInterval 2% W( [! |7 |) t/ q
DOSBlockingPeriod 10( t9 k2 V) S" i- N. T
DOSBlockingPeriod 600 DOSHashTableSize — 这是占用内存的大小,如果服务器比较繁忙,这个数值要设定大一点。- A0 |. ]9 a3 O0 J
DOSPageCount — 同一IP 在一个时段内可以存娶同一页面的次数,超过会被禁止。
, P/ g0 A2 |" X: k& \DOSSiteCount — 同一IP 在一个网站内可以占用多少object,超过会禁止。9 t# D ?9 f) A; s: O6 w
DOSPageInterval — DOSPageCount 内的时段设定。+ P, P9 M$ _8 T2 n1 L
DOSSiteInterval — DOSSiteCount 的时间设定,以秒为单位。1 e5 v2 @6 W" Q& G
DOSBlockingPeriod — 当发现疑似攻击后,使用者会收到403 Forbidden,这是设定封锁的时间,以秒为单位。 E. 最后重新启动 Apache 即可。
, M2 b* I d" \. b2 O% R |