欢迎来到好人卡资源网,专注网络技术资源收集,我们不仅是网络资源的搬运工,也生产原创资源。寻找资源请留言或关注公众号:烈日下的男人

Linux系统服务器,如何屏蔽国外IP访问及进行简单的防CC攻击拦截?

linux sky995 3年前 (2021-07-22) 704次浏览 0个评论

本文及资源最后更新时间 2021-07-22 by sky995

根据对大多数用户提交的问题进行总结,近期发布一期新的技术帮助文档,内容是:Linux系统服务器内,如何屏蔽国外IP访问以及进行简单的防CC攻击拦截?

第一部分:屏蔽国外IP访问

通过ssh远程登录服务器内,运行如下命令语句获取国内IP网段,会保存为/root/china_ssr.txt
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=$1
CNIP="/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 /")EOF
iptables -N ALLCNRULE iptables -I INPUT -p tcp -j ALLCNRULE iptables -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 RETURN iptables -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 ]];then        num=100else        num=$1fi
cd $(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 ]];then        for black_ip in $iplist            do                                ip_section=`echo $black_ip | awk -F"." '{print $1"."$2"."$3}'`                                grep -q $ip_section ./white_ip.txt                if [[ $? -eq 0 ]];then                                                echo $black_ip >>./recheck_ip.txt                else                                                iptables -nL | grep $black_ip || iptables -I INPUT -s $black_ip -j DROP                        echo $black_ip >>./black_ip.txt                fi           donefi

保存后执行以下语句:

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/bash  OLD_IFS=$IFS  IFS=$'\n'  
for status in `cat 网站访问日志路径 | grep '特征字符' | grep -v '127.0.0.1' | awk '{print $1}' |sort -n | uniq -c | sort -n -r | head -20`  do    IFS=$OLD_IFS    NUM=`echo $status | awk '{print $1}'`    IP=`echo $status | awk '{print $2}'`  
    if [ -z "`iptables -nvL | grep "dpt:80" | awk '{print $8}' | grep "$IP"`" ];then      if [ $NUM -gt 250 ];then        /sbin/iptables -I INPUT -p tcp  -s $IP --dport 80 -j DROP      fi    fi  done

保存后执行以下语句:

chmod +x deny_2.shsh deny_2.sh

最后使用crontab -e 添加到任务计划,每20分钟执行一次:

*/20 * * * * /root/deny_ip1.sh  >dev/null 2>&1
使用本教程请注意:
  1. 对于使用了百度云加速或其他CDN加速的,访问者IP可能会是CDN节点IP,则不适用此方式进行拦截。
  2. 对于方式1,若发现和白名单同一个段IP出现在高并发列表,将不会直接拉黑,而是写入到recheck_ip.txt。
  3. 对于方式2,执行前建议先将原日志文件改名,以重新生成的新的日志文件为准。
  4. 不建议长时间进行拦截,请在一段时间后待服务器负载正常,攻击基本停止后及时取消拦截,恢复原先状态。

好人卡资源网 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Linux系统服务器,如何屏蔽国外IP访问及进行简单的防CC攻击拦截?
喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址