代码:
#!/bin/sh
# /opt/sbin/kdc-pf-ddos
# Create at 2008-04-28 15:20, by yangxiangong
# Version 0.0.1
#--------------------------------------------------------------------------------------
# 与pf结合,形成对DDOS的方法, 确保在pf中存在一个表
# table persist
# 针对系统当前SYN连接数超过50的IP进行封杀,可根据系统承载能力动态调整50这个数值
# 部署时,请手动执行该脚本,然后放入计划任务每小时检测一次即可,
# 该程序执行时间大约为2分钟之内
# 被封的IP会记录在drop_ip_file这个文件中,如果过段时间服务正常了,可手动解封这些IP
#-------------------------------------------------------------------------------------
export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
#####################################################################################
#
# 宏 定 义 区 域 (定义权限,可以随便修改)
#
#####################################################################################
#*************************************************************************************
# @Desc: 超过该值,就加入pf中的TABLE表,禁止访问了
# @Var: 根据具体的服务器性能而定的
#-------------------------------------------------------------------------------------
# @Notes: 允许一个Ip链接本机的最大数量
#-------------------------------------------------------------------------------------
DDOS_IP_MAX_REQUESTED='50'
#*************************************************************************************
# @Desc: 日志文件位置,正常後可以通过它来解封
# @Var: string
#-------------------------------------------------------------------------------------
# @Notes: DDOS被禁止的Ip日志
#-------------------------------------------------------------------------------------
DDOS_IP_LOGFILE='/var/log/ddos.log'
LOCALHOST_ADMIN='210.76.108.158'
#####################################################################################
#
# 程 序 脚 本 区 域 (请勿随便修改,一旦改动,就是脚本版本升级一次)
#
#####################################################################################
netstat -ant |grep '\<80\>' |grep SYN_RECV |awk '{print $5}' |awk -F\: '{print $1}'|sort |uniq -c |sort >$DDOS_IP_LOGFILE
while read LINE
do
syn_num=`echo $LINE |awk '{print $1}'`
if [ $syn_num -gt $DDOS_IP_MAX_REQUESTED ]
then
drop_ip=`echo $LINE |awk '{print $2}'`
if [ $drop_ip != $LOCALHOST_ADMIN ]
then
iptables -I INPUT -p tcp -s $drop_ip --syn -j DROP
#/sbin/pfctl -t abusive_hosts -Tadd $drop_ip
echo $drop_ip >> $DDOS_IP_LOGFILE
fi
fi
done<$DDOS_IP_LOGFILE
echo "DDOS end";