Debian防御DDOS(简易版本)
DDOS攻击主要还是靠硬防,不过,对于一些小的骚扰,可以采用DDoS deflate+iptables的方法减轻。
=================================================================
一、DDoS deflate
DDoS deflate官方网站:http://deflate.medialayer.com/
如何确认是否受到DDOS攻击?
执行:netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
执行后,将会显示服务器上所有的每个IP多少个连接数。
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
1 106.11.68.13
1 Address
1 servers)
2 39.69.84.165
6 125.65.242.94
132 127.0.0.1
每个IP几个、十几个或几十个连接数都还算比较正常,如果像上面成百上千肯定就不正常了。
- 安装DDoS deflate
wget http://www.inetbase.com/scripts/ddos/install.sh //下载DDoS deflate chmod 0700 install.sh //添加权限 ./install.sh //执行
- 配置DDoS deflate
下面是DDoS deflate的默认配置位于/usr/local/ddos/ddos.conf ,内容如下:
\##### Paths of the script and other files
PROGDIR="/usr/local/ddos"
PROG="/usr/local/ddos/ddos.sh"
IGNORE_IP_LIST="/usr/local/ddos/ignore.ip.list" //IP地址白名单
CRON="/etc/cron.d/ddos.cron" //定时执行程序
APF="/etc/apf/apf"
IPT="/sbin/iptables"
\##### frequency in minutes for running the script
\##### Caution: Every time this setting is changed, run the script with --cron
\##### option so that the new frequency takes effect
FREQ=1 //检查时间间隔,默认1分钟
\##### How many connections define a bad IP? Indicate that below.
NO_OF_CONNECTIONS=150 //最大连接数,超过这个数IP就会被屏蔽,一般默认即可
\##### APF_BAN=1 (Make sure your APF version is atleast 0.96)
\##### APF_BAN=0 (Uses iptables for banning ips instead of APF)
APF_BAN=1 //使用APF还是iptables。推荐使用iptables,将APF_BAN的值改为0即可。
\##### KILL=0 (Bad IPs are'nt banned, good for interactive execution of script)
\##### KILL=1 (Recommended setting)
KILL=1 //是否屏蔽IP,默认即可
\##### An email is sent to the following address when an IP is banned.
\##### Blank would suppress sending of mails
EMAIL_TO="root" //当IP被屏蔽时给指定邮箱发送邮件,推荐使用,换成自己的邮箱即可
\##### Number of seconds the banned ip should remain in blacklist.
BAN_PERIOD=600 //禁用IP时间,默认600秒,可根据情况调整
用户可根据给默认配置文件加上的注释提示内容,修改配置文件。
查看/usr/local/ddos/ddos.sh
文件的第117行
netstat -ntu | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -nr > $BAD_IP_LIST
修改为以下代码即可!
netstat -ntu | awk ‘{print $5}’ | cut -d: -f1 | sed -n ‘/[0-9]/p’ | sort | uniq -c | sort -nr > $BAD_IP_LIST
=================================================================
二、iptables
SYN攻击是利用TCP/IP协议3次握手的原理,发送大量的建立连接的网络包,但不实际建立连接,最终导致被攻击服务器的网络队列被占满,无法被正常用户访问。SYN Flood攻击虽然原理简单,但是造成的危害却十分严重。
首先检测,两种方法:
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
netstat -alnt | awk '{print $5}' |awk -F ":" '{print $1}' | sort | uniq -c |sort -n
初步先制定iptables关于单个IP并发TCP连接
限制连往本机的web服务,1个C段的IP的并发连接不超过100个,超过的被拒绝:
\#iptables -I INPUT -p tcp --dport 80 -m iplimit --iplimit-above 100 --iplimit-mask 24 -j REJECT
延伸例子:
限制连往本机的telnet单个IP并发连接为2个,超过的连接被拒绝:
\#iptables -I INPUT -p tcp --dport 23 -m iplimit --iplimit-above 2 -j REJECT
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 100 --connlimit-mask 24 -j REJECT
\#限制连往本机的web服务,1个C段的IP的并发连接不超过100个,超过的被拒绝:
延伸例子:
限制连往本机的telnet单个IP并发连接为2个,超过的连接被拒绝:
\#iptables -I INPUT -p tcp --dport 23 -m connlimit --connlimit-above 2 -j REJECT
iplimit模块不可用,现改用connlimit
防止同步包洪水(Sync Flood)
*# iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT也有人写作#iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT--limit 1/s 限制syn并发数每秒1次,可以根据自己的需要修改*
iptables -t mangle -A POSTROUTING -p tcp --syn -m connlimit --connlimit-above 20 -j LOG --log-level 4 --log-prefix "iptables: "
iptables -t mangle -A POSTROUTING -p tcp --syn -m connlimit --connlimit-above 20 -j DROP
\#控制单个IP的最大并发连接数(我设置了最大并发连接数为20)
**防止各种端口扫描**
\# iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
Ping洪水攻击(Ping of Death)
\# iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。