|
互联网如同现实社会一样充满钩心斗角,网站被DDOS也成为站长最头疼的事。在没有硬防的情况下,寻找软件代替是最直接的方法,比如用 iptables,但是iptables不能在自动屏蔽,只能手动屏蔽。 一、什么是DDOS攻击? DDoS也就是分布式拒绝服务攻击。它使用与普通的拒绝服务攻击同样的方法,但是发起攻击的源是多个。通常攻击者使用下载的工具渗透无保护的主机,当获得该主机的适当的访问权限后,攻击者在主机中安装软件的服务或进程(以下简侈怔理)。这些代理保持睡眠状态,直到从它们的主控端得到指令,对指定的目标发起拒绝服务攻击。 二、如何确认自己受到DDOS攻击? 在系统上执行: netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n8 V) y: J0 R+ c" F a! N" S
执行后,将会显示服务器上所有的每个IP多少个连接数。& i+ \, B. o0 O9 a; e8 V( h
以下是我自己用VPS测试的结果:: z; X. J. ?! x9 B" }5 n
li88-99:~# netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
# b! g( r6 d; U' S% I1 114.226.9.132
- y- D# I9 k+ _7 b) t- m- G1 P1 174.129.237.157- R6 y" ?! c1 q
1 58.60.118.142
2 W. D8 g. m( O% l6 G1 Address+ H; A9 |$ p% m# q0 L8 x5 K
1 servers)
! B% I! s; O1 Z6 L( I7 l2 118.26.131.78
& W% P; {3 s& l H* s3 123.125.1.202
$ v4 T/ ?3 a% G1 u$ a3 220.248.43.119& w: B$ ]9 f' Q/ M
4 117.36.231.253
' ?, i6 I* L8 J% ]4 119.162.46.124
p0 z6 {& ~8 H% D- Y, O6 219.140.232.1280 m9 f+ ^( L% U
8 220.181.61.318 }( k0 x# d' w# k; d: b
2311 67.215.242.196
2 k2 R( L" _0 S0 p9 V每个IP几个、十几个或几十个连接数都还算比较正常,如果像上面成百上千肯定就不正常了。/ X0 F! v. k( O( \0 w" S% N% A: n1 E% Y
三、防范DDOS攻击的方法: 一些常用的防DDOS攻击的方法,罗列如下: 1.增加硬件防火墙和增加硬件设备来承载和抵御DDOS攻击,最基本的方法,但成本比较高。 2.修改SYN设置抵御SYN攻击:+ Y) \% W2 U9 k
SYN攻击是利用TCP/IP协议3次握手的原理,发送大量的建立连接的网络包,但不实际建立连接,最终导致被攻击服务器的网络队列被占满,无法被正常用户访问。 Linux内核提供了若干SYN相关设置,使用命令:% K8 M D. |* b2 q
sysctl -a | grep syn7 }6 V! g. M9 ~6 ~6 m
看到:" \7 r. l, L1 I
net.ipv4.tcp_max_syn_backlog = 10241 p) `0 p# w( n, F3 l
net.ipv4.tcp_syncookies = 0; u! h9 e. s0 S! D$ V
net.ipv4.tcp_synack_retries = 5
: v3 d( i. |$ K* anet.ipv4.tcp_syn_retries = 5 tcp_max_syn_backlog是SYN队列的长度,tcp_syncookies是一个开关,是否打开SYN Cookie
4 ]! J @( J- @, N4 x功能,该功能可以防止部分SYN攻击。tcp_synack_retries和tcp_syn_retries定义SYN2 O7 y9 {- M5 \- X% W* v1 ]
的重试次数。 加大SYN队列长度可以容纳更多等待连接的网络连接数,打开SYN Cookie功能可以阻止部分, f0 v( h. Z, q0 z3 `% W% E
SYN攻击,降低重试次数也有一定效果。 调整上述设置的方法是:
8 q3 D5 W9 E& G4 v# W: s3 K& D增加SYN队列长度到2048:$ m" j0 [' N/ b) |5 D3 _6 v3 R! \
sysctl -w net.ipv4.tcp_max_syn_backlog=2048
/ ~6 i- I- g- o: C$ U8 |打开SYN COOKIE功能:
+ Q# N5 u* I' L- ksysctl -w net.ipv4.tcp_syncookies=11 Q }) Y7 Y* f3 U/ k$ T, K
降低重试次数:
/ Z- X2 `1 r' X% Y/ O4 P* zsysctl -w net.ipv4.tcp_synack_retries=3
3 s4 x) [* j- ~# {" o6 `% b/ zsysctl -w net.ipv4.tcp_syn_retries=3 为了系统重启动时保持上述配置,可将上述命令加入到/etc/rc.d/rc.local文件中。 3.安装iptables对特定ip进行屏蔽。 A.安装iptables和系统内核版本对应的内核模块kernel-smp-modules-connlimit- W+ O* ]; r6 L& g, l2 `
B. 配置相应的iptables规则
* S! @1 T& q3 i' `示例如下: (1)控制单个IP的最大并发连接数
. @" [& ?1 _9 h6 d2 o3 ]; E: c kiptables -I INPUT -p tcp –dport 80 -m connlimit –connlimit-above 50 -j REJECT
) d) K/ g/ L' I0 p/ C- b8 |#允许单个IP的最大连接数为 30
0 T$ \3 m) e) b5 S7 N1 }(2)控制单个IP在一定的时间(比如60秒)内允许新建立的连接数1 n( I9 M$ Z( f$ O
iptables -A INPUT -p tcp –dport 80 -m recent –name BAD_HTTP_ACCESS –update –seconds 60 \$ ?% Z4 b3 u8 a5 O/ Y$ q" v
–hitcount 30 -j REJECT
0 b: f% D4 S3 X' {iptables -A INPUT -p tcp –dport 80 -m recent –name BAD_HTTP_ACCESS –set -j ACCEPT
. x# e; t1 Z9 g' }( D) A#单个IP在60秒内只允许最多新建30个连接 (3)用iptables屏蔽IP) `6 \. M3 g' c- j; f" K
iptables -I RH-Lokkit-0-50-INPUT 1 -p tcp -m tcp -s 213.8.166.227 --dport 80 --syn -j REJECT) F/ f9 X7 K( Y/ R( i8 ?+ {6 y1 S# r2 ]
指定端口的参数是--dport 80;多了--syn参数,可以自动检测sync攻击, d7 U. }- e$ s3 c
(4)使用iptables禁止ping:$ K+ k/ c8 j, B$ P% |1 {
iptables -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* S7 Z' i3 t/ m- ~ a' b: T
(5)允许某ip连接* ^/ y) t# B( P; ~ [% O
iptables -I RH-Firewall-1-INPUT 1 -p tcp -m tcp -s 192.168.0.51 --syn -j ACCEPT/ g! u( A: n8 J/ Q5 v- w6 D+ C
C. 验证, W4 H4 h8 R9 w( \; t8 a
(1)工具:flood_connect.c(用来模拟攻击)9 I8 T9 g! z4 _& O z
(2)查看效果:; S+ J# `5 c$ I" `; d
使用 watch ‘netstat -an | grep:21 | \ grep< 模拟攻击客户机的IP>| wc -l’
0 p0 j/ J* f/ m ~4 z+ o6 ]实时查看模拟攻击客户机建立起来的连接数, D9 j& f) D0 A. [: s
使用' [% e2 I L3 O5 d/ L" `& m
watch ‘iptables -L -n -v | \grep< 模拟攻击客户机的IP>’& K# y) i. Z" I8 w; R$ l3 P$ C5 n
查看模拟攻击客户机被 DROP 的数据包数。1 M. T" N. N+ Y9 q1 _
D.注意( A- e, t% R; J1 L% J' T
为了增强iptables防止CC攻击的能力,最好调整一下ipt_recent的参数如下:
) g' Z, |1 `7 V: M( z" z#cat/etc/modprobe.conf6 C: Y' M5 |- T: l7 N
options ipt_recent ip_list_tot=1000 ip_pkt_list_tot=60" _& O: }2 t" b$ t2 O7 G
#记录1000个IP地址,每个地址记录60个数据包
" n! r, j: S; i2 h' U#modprobe ipt_recent E.可编写脚本自动提娶攻击ip然后自动屏蔽: */2 * * * * /usr/local/nginx/var/log/drop.sh #!/bin/sh/ O. H! j+ e! `# \ |, i) \. f
cd /usr/local/nginx/var/log
6 }. K9 N5 q$ ^5 N& xtail access.log -n 1000 |grep vote.php | |sort |uniq -c |sort -nr |awk '{if ($2!=null && $1>50)}' > drop_ip.txt; f: y2 N0 }+ j2 {+ F
for i in `cat drop_ip.txt`
$ `: ?8 p2 Q8 @! zdo
2 {7 X% |. R5 G8 n1 Y, D4 [/sbin/iptables -I INPUT -s $i -j DROP;: G+ C7 }) b3 v2 q+ Y7 G! \+ @
done
) [ M- G6 ?; {* l, v这shell 每几分钟执行一次,就可自动屏蔽那些不正常IP,相信大家都看的懂,下面是针对连接数屏蔽代码 #!/bin/sh
# @" S8 S! V! X" ~/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$ s8 o5 ~( `, E$ X. V+ N* X; d
for i in `cat drop_ip.txt`. _# W( q4 y% i
do" m( P5 I5 n5 ?
/sbin/iptables -I INPUT -s $i -j DROP;' t# N6 V6 F7 T
done
9 I" `: j' A8 b; e8 Y0 q说下,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
& f( v1 h4 |: {) X/ Schmod 0700 install.sh //添加权限
& w- u8 g6 E9 i( `4 Y. Z7 M./install.sh //执行 (2)配置DDoS deflate 下面是DDoS deflate的默认配置位于/usr/local/ddos/ddos.conf ,内容如下: ##### Paths of the script and other files% \) [4 v( {+ Y( s
PROGDIR=”/usr/local/ddos”
h8 l' B: c7 I6 z$ R) XPROG=”/usr/local/ddos/ddos.sh”- P0 j: f' x5 g$ K* _$ m
IGNORE_IP_LIST=”/usr/local/ddos/ignore.ip.list” //IP地址白名单& v1 u! r2 Y2 l, L' I
CRON=”/etc/cron.d/ddos.cron” //定时执行程序
* S; D; o1 t0 G! [" JAPF=”/etc/apf/apf”
7 V7 |$ S- l6 u, E0 e1 _IPT=”/sbin/iptables” ##### frequency in minutes for running the script
: i* X( v4 }& ^0 H4 x# v, K" _##### Caution: Every time this setting is changed run the script with –cron5 b% m: A2 g. V' J& @
##### option so that the new frequency takes effect9 F$ H8 w. | p. I: W. [
FREQ=1 //检查时间间隔,默认1分钟 ##### How many connections define a bad IP? Indicate that below.& A$ I+ W% C, ?, Z' c7 f2 [
NO_OF_CONNECTIONS=150 //最大连接数,超过这个数IP就会被屏蔽,一般默认即可 ##### APF_BAN=1 (Make sure your APF version is atleast 0.96)1 S0 \/ z/ i3 Z7 t7 Q- D' d8 |
##### APF_BAN=0 (Uses iptables for banning ips instead of APF)
9 Z3 B4 w7 K- d& e# s. I9 TAPF_BAN=1 //使用APF还是iptables,推荐使用iptables ##### KILL=0 (Bad IPs are’nt banned good for interactive execution of script)
& [* R- {. \6 m) i$ R1 g##### KILL=1 (Recommended setting)$ ]/ Q. T) o0 }9 W8 M' c5 [
KILL=1 //是否屏蔽IP,默认即可 #### An email is sent to the following address when an IP is banned.4 N8 o+ l" j8 B, s4 m8 ?
##### Blank would suppress sending of mails
/ c+ Y0 n ~, D) }* }: e) LEMAIL_TO=”root” //当IP被屏蔽时给指定邮箱发送邮件,推荐使用,换成自己的邮箱即可 ##### Number of seconds the banned ip should remain in blacklist.0 E! s7 w4 Q W) [; n. B+ g4 c
BAN_PERIOD=600 //禁用IP时间,默认600秒,可根据情况调整 用户可根据给默认配置文件加上的注释提示内容,修岗?置文件。 喜欢折腾的可以用Web压力测试软件(《web服务器性能/压力测试工具http_load、webbench、ab、Siege使用教程》)测试一下效果,这东西只能防御小流量的攻击了,聊胜于无吧。 5.APACHE上安装mod_evasive 组件增强抵御力 mod_evasive是一个预防Apache 遭受DDos 攻击的模块,可以防止同一个IP 对相同URI 发出的大量请求,可设定的选项有:
2 E: p& U5 ]) c– 限制同一个IP 在一定秒数内请求一个页面或档案的次数。5 S1 o' V( Q1 i
– 限制同一个IP 一秒内只可发出50 个请求。; \' e, E; ]6 j9 Y3 @1 J8 B& N/ v
– 设定被禁止的 IP 封锁时间。 3 ^8 ?7 u' z2 F
以下是 mod_evasive 的安装方法: A. 先将原来的 httpd.conf 备份起来。
1 W1 e; A* r" ^/ D6 X B. 到 C. 在指令模式解压及编译 mod_evasive: tar zxvf mod_evasive_1.10.1.tar.gz
- O; w$ R6 R# ~cd mod_evasive/% G' ~6 ~1 T9 |6 Z1 ^
apxs -cia mod_evasive20.c
$ \, J: b6 ?, e* y' r3 e; s以上的apxs 会放在Apache 的bin 目录内;如果Apache 版本是1.3 的话,指令要改为: apxs -cia mod_evasive.c8 N2 O! Q7 ^4 U; L" `1 h, K
安装好mod_evasive 后,便要修改httpd.conf 内容。 D. 开启 httpd.conf,加入以内容: DOSHashTableSize 3097
& k6 P- F* F& P: P# j: m, ADOSPageCount 5
5 v3 p3 q" t$ ?. K# f$ S) |DOSSiteCount 100
2 X4 U7 D$ }$ t9 S# MDOSPageInterval 2
( J9 u% j2 M8 H5 _DOSSiteInterval 2
7 J4 M- R& a6 x) SDOSBlockingPeriod 10
+ p5 T1 [( G1 \# A+ aDOSBlockingPeriod 600 DOSHashTableSize — 这是占用内存的大小,如果服务器比较繁忙,这个数值要设定大一点。8 X7 ~2 i: _1 L5 \9 B+ L
DOSPageCount — 同一IP 在一个时段内可以存娶同一页面的次数,超过会被禁止。0 {; T" T" U. @% |' {
DOSSiteCount — 同一IP 在一个网站内可以占用多少object,超过会禁止。
2 _- E1 e1 \( l2 A! f) kDOSPageInterval — DOSPageCount 内的时段设定。: X% T% V" B: c# m2 a
DOSSiteInterval — DOSSiteCount 的时间设定,以秒为单位。$ l+ X8 m2 b* D& z+ ?$ S; T6 D
DOSBlockingPeriod — 当发现疑似攻击后,使用者会收到403 Forbidden,这是设定封锁的时间,以秒为单位。 E. 最后重新启动 Apache 即可。 & |0 o4 ]' S2 M
|