本文及资源最后更新时间 2021-07-22 by sky995
第一部分:屏蔽国外IP访问
wget -q --timeout=60 -O- 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | awk -F\| '/CN\|ipv4/ { printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > /root/china_ssr.txt
将下面脚本保存为/root/allcn.sh ,并设置可执行权限( 命令:chmod +x allcn.sh)
mmode=$1CNIP="/root/china_ssr.txt"gen_iplist() {cat <<-EOF$(cat ${CNIP:=/dev/null} 2>/dev/null)EOF}flush_r() {iptables -F ALLCNRULE 2>/dev/nulliptables -D INPUT -p tcp -j ALLCNRULE 2>/dev/nulliptables -X ALLCNRULE 2>/dev/nullipset -X allcn 2>/dev/null}mstart() {ipset create allcn hash:net 2>/dev/nullipset -! -R <<-EOF$(gen_iplist | sed -e "s/^/add allcn /")EOFiptables -N ALLCNRULEiptables -I INPUT -p tcp -j ALLCNRULEiptables -A ALLCNRULE -s 127.0.0.0/8 -j RETURNiptables -A ALLCNRULE -s 169.254.0.0/16 -j RETURNiptables -A ALLCNRULE -s 224.0.0.0/4 -j RETURNiptables -A ALLCNRULE -s 255.255.255.255 -j RETURNiptables -A ALLCNRULE -m set --match-set allcn src -j RETURNiptables -A ALLCNRULE -p tcp -j DROP}if [ "$mmode" == "stop" ] ;thenflush_rexit 0fiflush_rsleep 1mstart
执行如下命令将开始拦截
/root/allcn.sh
执行如下命令即可停止拦截
/root/allcn.sh stop
第二部分:简单的CC攻击拦截
方式1:通过netstat -an命令统计出当前请求并发大于100的IP,然后将不在白名单的IP自动加入DROP规则
首先运行
vi deny_1.sh
添加以下命令语句
#!/bin/bashif [[ -z $1 ]];thennum=100elsenum=$1ficd $(cd $(dirname $BASH_SOURCE) && pwd)iplist=`netstat -an |grep ^tcp.*:80|egrep -v 'LISTEN|127.0.0.1'|awk -F"[ ]+|[:]" '{print $6}'|sort|uniq -c|sort -rn|awk -v str=$num '{if ($1>str){print $2} fi}'`if [[ ! -z $iplist ]];thenfor black_ip in $iplistdoip_section=`echo $black_ip | awk -F"." '{print $1"."$2"."$3}'`grep -q $ip_section ./white_ip.txtif [[ $? -eq 0 ]];thenecho $black_ip >>./recheck_ip.txtelseiptables -nL | grep $black_ip || iptables -I INPUT -s $black_ip -j DROPecho $black_ip >>./black_ip.txtfidonefi
保存后执行以下语句:
chmod +x deny_1.shsh deny_1.sh
拦截的IP会记录到black_ip.txt中,如果有要排除的白名单IP,可将这些IP加入到white_ip.txt,一行一个。
方式2:通过web网站日志中攻击者访问特征,根据这些特征过滤出攻击的ip,利用iptables来阻止(排除本机IP:127.0.0.1)。
首先运行
vi deny_2.sh
添加以下命令语句:
#!/bin/bashOLD_IFS=$IFSIFS=$'\n'for status in `cat 网站访问日志路径 | grep '特征字符' | grep -v '127.0.0.1' | awk '{print $1}' |sort -n | uniq -c | sort -n -r | head -20`doIFS=$OLD_IFSNUM=`echo $status | awk '{print $1}'`IP=`echo $status | awk '{print $2}'`if [ -z "`iptables -nvL | grep "dpt:80" | awk '{print $8}' | grep "$IP"`" ];thenif [ $NUM -gt 250 ];then/sbin/iptables -I INPUT -p tcp -s $IP --dport 80 -j DROPfifidone
保存后执行以下语句:
chmod +x deny_2.shsh deny_2.sh
最后使用crontab -e 添加到任务计划,每20分钟执行一次:
*/20 * * * * /root/deny_ip1.sh >dev/null 2>&1
- 对于使用了百度云加速或其他CDN加速的,访问者IP可能会是CDN节点IP,则不适用此方式进行拦截。
- 对于方式1,若发现和白名单同一个段IP出现在高并发列表,将不会直接拉黑,而是写入到recheck_ip.txt。
- 对于方式2,执行前建议先将原日志文件改名,以重新生成的新的日志文件为准。
- 不建议长时间进行拦截,请在一段时间后待服务器负载正常,攻击基本停止后及时取消拦截,恢复原先状态。