!
也想出现在这里? 联系我们
广告位
当前位置:首页>教程分享>服务器教程>Linux服务器 屏蔽国外IP访问及简单的防CC攻击拦截

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 </dev/null)
EOF
}

flush_r() {
iptables  -F ALLCNRULE 2>/dev/null
iptables -D INPUT -p tcp -j ALLCNRULE 2>/dev/null
iptables  -X ALLCNRULE 2>/dev/null
ipset -X allcn 2>/dev/null
}

mstart() {
ipset create allcn hash:net 2>/dev/null
ipset -! -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 RETURN
iptables -A ALLCNRULE -s 169.254.0.0/16 -j RETURN
iptables -A ALLCNRULE -s 224.0.0.0/4 -j RETURN
iptables -A ALLCNRULE -s 255.255.255.255 -j RETURN
iptables -A ALLCNRULE -m set --match-set allcn  src -j RETURN 
iptables -A ALLCNRULE -p tcp -j DROP 
}
if [ \"$mmode\" == \"stop\" ] ;then
flush_r
exit 0
fi
flush_r
sleep 1
mstart

执行如下命令将开始拦截

/root/allcn.sh

执行如下命令即可停止拦截

/root/allcn.sh stop

CC攻击拦截

方式1:通过netstat -an命令统计出当前请求并发大于100的IP,然后将不在白名单的IP自动加入DROP规则

首先运行

vi  deny_1.sh

添加以下命令语句

#!/bin/bash
if [[ -z $1 ]];then
        num=100
else
        num=$1
fi

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
           done
fi

保存后执行以下语句:

chmod +x deny_1.sh
sh 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.sh
sh 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. 不建议长时间进行拦截,请在一段时间后待服务器负载正常,攻击基本停止后及时取消拦截,恢复原先状态。

给TA打赏
共{{data.count}}人
人已打赏
服务器教程

Mysql myisam存储引擎转innodb方法

2021-4-17 20:28:35

服务器教程

宝塔面板命令行帮助教程(包含重置密码)

2021-4-17 20:28:37

声明 本站上的部份代码及教程来源于互联网,仅供网友学习交流,若您喜欢本文可附上原文链接随意转载。无意侵害您的权益,请发送邮件至 [email protected] 或点击右侧 私信:吉吉国王 反馈,我们将尽快处理。
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索
OneEase