阿里云linux服务器使用脚本通过安全组屏蔽异常海外访问ip

简介: 公网网站可能会遭受黑客攻击导致访问异常,使用此脚本可以屏蔽掉异常IP 恢复访问。也可自行设置定时任务定期检测屏蔽。
#!/bin/bash

# 配置区域
LOG_FILE="******************************"          # Nginx访问日志路径
ALIYUN_REGION="cn-hangzhou"                        # 阿里云区域ID
ALIYUN_SECURITY_GROUP_ID="sg-********"             # 安全组ID
ALIYUN_ACCESS_KEY="***************"                # 阿里云AccessKey
ALIYUN_SECRET_KEY="***************"                # 阿里云SecretKey
MAX_ANALYZE_LINES=4000                             # 分析日志行数
TOP_IP_COUNT=6                                     # 取访问量前几名IP

# 临时文件
TMP_IP_FILE="/tmp/top_aliyun_ips.txt"
TMP_COUNTRY_FILE="/tmp/aliyun_ip_country.txt"

# 日志设置
LOG_FILE_PATH="/var/log/aliyun_ip_blocker.log"

# 获取当前时间
DATE=$(date +"%Y-%m-%d %H:%M:%S")

# 日志函数
log() {
    local level=$1
    local message=$2
    local color_code=""
    
    case $level in
        "INFO") color_code="\033[32m" ;;  # 绿色
        "WARN") color_code="\033[33m" ;;  # 黄色
        "ERROR") color_code="\033[31m" ;; # 红色
        *) color_code="\033[0m" ;;
    esac
    
    local log_entry="[$DATE][$level] $message"
    echo -e "${color_code}${log_entry}\033[0m" | tee -a $LOG_FILE_PATH
}

# 检查依赖
check_dependencies() {
    local missing=0
    
    if ! command -v aliyun &> /dev/null; then
        log "ERROR" "阿里云CLI工具未安装,请先执行: curl -sSL https://aliyuncli.alicdn.com/aliyun-cli-linux-latest-amd64.tgz | tar -xz -C /usr/local/bin && mv /usr/local/bin/aliyun-linux-amd64 /usr/local/bin/aliyun"
        missing=1
    fi
    
    if ! command -v jq &> /dev/null; then
        log "ERROR" "jq工具未安装,请先执行: apt-get install -y jq 或 yum install -y jq"
        missing=1
    fi
    
    [ $missing -eq 1 ] && exit 1
    
    log "INFO" "√ 所有依赖检查通过"
}

# 配置阿里云CLI
setup_aliyun_cli() {
    export ALIBABACLOUD_ACCESS_KEY_ID=$ALIYUN_ACCESS_KEY
    export ALIBABACLOUD_ACCESS_KEY_SECRET=$ALIYUN_SECRET_KEY
    
    aliyun configure set \
        --region $ALIYUN_REGION \
        --access-key-id $ALIYUN_ACCESS_KEY \
        --access-key-secret $ALIYUN_SECRET_KEY \
        --mode AK
    
    log "INFO" "√ 阿里云CLI配置完成"
}

# 分析日志获取恶意IP
analyze_logs() {
    log "INFO" "➤ 开始分析最近${MAX_ANALYZE_LINES}条访问日志..."
    
    tail -n $MAX_ANALYZE_LINES $LOG_FILE | \
        awk '{print $1}' | \
        sort | \
        uniq -c | \
        sort -nr | \
        head -n $TOP_IP_COUNT > $TMP_IP_FILE

    if [ ! -s "$TMP_IP_FILE" ]; then
        log "ERROR" "无法从日志中提取IP地址"
        exit 1
    fi

    log "INFO" "√ 获取到访问量前${TOP_IP_COUNT}的IP:"
    column -t $TMP_IP_FILE | while read line; do
        log "INFO" "   $line"
    done
}

# 查询IP地理位置
check_ip_location() {
    log "INFO" "➤ 开始分析IP地理位置..."
    
    while read -r line; do
        count=$(echo "$line" | awk '{print $1}')
        ip=$(echo "$line" | awk '{print $2}')
        
        # 跳过本地IP
        if [[ "$ip" == 127.0.0.* ]] || [[ "$ip" == 192.168.* ]] || [[ "$ip" == 10.* ]]; then
            log "WARN" "⚠️ 跳过本地IP: $ip (访问次数: $count)"
            continue
        fi
        
        log "INFO" "🔍 正在查询 $ip (访问次数: $count)..."
        
        country=$(curl -m 5 -s "http://ip-api.com/line/$ip?fields=countryCode")
        
        if [ -z "$country" ]; then
            log "WARN" "无法确定 $ip 的地理位置,默认视为境外IP"
            country="XX"
        fi
        
        echo "$ip $country $count" >> $TMP_COUNTRY_FILE
        
        if [ "$country" != "CN" ]; then
            log "WARN" "‼️ 检测到非中国IP: $ip (国家: $country, 访问次数: $count)"
            block_ip $ip $country $count
        else
            log "INFO" "✓ 中国IP: $ip (访问次数: $count)"
        fi
        
        sleep 1.3
    done < $TMP_IP_FILE
}

# 屏蔽IP到阿里云安全组
block_ip() {
    local ip=$1
    local country=$2
    local count=$3
    
    # 检查是否已存在该规则
    existing_rule=$(aliyun ecs DescribeSecurityGroupAttribute \
        --RegionId $ALIYUN_REGION \
        --SecurityGroupId $ALIYUN_SECURITY_GROUP_ID \
        --Direction ingress | \
        jq -r ".Permissions.Permission[] | select(.SourceCidrIp == \"$ip/32\")")
    
    if [ -n "$existing_rule" ]; then
        log "WARN" "⏩ 安全组中已存在 $ip 的屏蔽规则,跳过添加"
        return
    fi
    
    # 添加安全组规则
    log "INFO" "🛡️ 正在将 $ip 添加到安全组屏蔽规则..."
    
    aliyun ecs AuthorizeSecurityGroup \
        --RegionId $ALIYUN_REGION \
        --SecurityGroupId $ALIYUN_SECURITY_GROUP_ID \
        --IpProtocol tcp \
        --PortRange "1/65535" \
        --SourceCidrIp "$ip/32" \
        --Policy drop \
        --Priority 100 \
        --Description "Blocked by script: $country, $count requests" \
        --NicType internet
    
    if [ $? -eq 0 ]; then
        log "INFO" "✅ 成功屏蔽IP: $ip (国家: $country)"
    else
        log "ERROR" "❌ 屏蔽IP $ip 失败"
    fi
}

# 主函数
main() {
    echo "=============================================="
    log "INFO" "阿里云安全组IP屏蔽脚本启动"
    echo "=============================================="
    
    # 检查root权限
    if [ "$(id -u)" -ne 0 ]; then
        log "ERROR" "此脚本必须以root用户身份运行"
        exit 1
    fi
    
    check_dependencies
    setup_aliyun_cli
    analyze_logs
    check_ip_location
    
    # 清理临时文件
    rm -f $TMP_IP_FILE $TMP_COUNTRY_FILE
    log "INFO" "√ 临时文件已清理"
    
    echo "=============================================="
    log "INFO" "脚本执行完成"
    echo "=============================================="
}

# 执行主函数
main
目录
相关文章
|
9月前
|
数据挖掘
服务器数据恢复——服务器异常断电造成raid5阵列故障的数据恢复案例
某服务器上有一组由12块硬盘组建的raid5磁盘阵列。 机房供电不稳定导致机房中该服务器非正常断电,重启服务器后管理员发现服务器无法正常使用。 意外断电可能会导致服务器上的raid模块损坏。
|
5月前
|
域名解析 运维 监控
如何检测服务器是否被入侵?解析5大异常指标
本文系统介绍了服务器入侵的五大检测维度:硬件资源、网络流量、系统日志、文件完整性及综合防护。涵盖CPU、内存异常,可疑外联与隐蔽通信,登录行为审计,关键文件篡改识别等内容,并提供实用工具与防护建议,助力运维人员快速发现潜在威胁,提升系统安全防御能力。转载链接:https://www.ffy.com/latest-news/1916688607247077376
411 0
如何检测服务器是否被入侵?解析5大异常指标
|
7月前
|
弹性计算 安全 Linux
阿里云服务器ECS安装宝塔Linux面板、安装网站(新手图文教程)
本教程详解如何在阿里云服务器上安装宝塔Linux面板,涵盖ECS服务器手动安装步骤,包括系统准备、远程连接、安装命令执行、端口开放及LNMP环境部署,手把手引导用户快速搭建网站环境。
|
9月前
|
Linux 网络安全 数据安全/隐私保护
使用Linux系统的mount命令挂载远程服务器的文件夹。
如此一来,你就完成了一次从你的Linux发车站到远程服务器文件夹的有趣旅行。在这个技术之旅中,你既探索了新地方,也学到了如何桥接不同系统之间的距离。
1523 21
|
8月前
|
Java Linux 网络安全
Linux云端服务器上部署Spring Boot应用的教程。
此流程涉及Linux命令行操作、系统服务管理及网络安全知识,需要管理员权限以进行配置和服务管理。务必在一个测试环境中验证所有步骤,确保一切配置正确无误后,再将应用部署到生产环境中。也可以使用如Ansible、Chef等配置管理工具来自动化部署过程,提升效率和可靠性。
773 13
|
8月前
|
运维 安全 算法
服务器 CPU 占用忽高忽低?排查这 6 个隐藏进程,90% 的异常都能解决
服务器运维中,CPU占用忽高忽低常由隐藏进程引发,影响服务稳定性。本文介绍六大需排查的隐藏进程:异常编译、挖矿程序、内存泄漏、网络请求异常、日志轮转问题及恶意软件。通过排查工具如top、ps、netstat等定位问题进程,并提供针对性解决方法,帮助开发者快速稳定服务器性能。
2123 0
|
8月前
|
Oracle 关系型数据库 数据库
数据库数据恢复—服务器异常断电导致Oracle数据库报错的数据恢复案例
Oracle数据库故障: 某公司一台服务器上部署Oracle数据库。服务器意外断电导致数据库报错,报错内容为“system01.dbf需要更多的恢复来保持一致性”。该Oracle数据库没有备份,仅有一些断断续续的归档日志。 Oracle数据库恢复流程: 1、检测数据库故障情况; 2、尝试挂起并修复数据库; 3、解析数据库文件; 4、导出并验证恢复的数据库文件。
|
8月前
|
监控 Linux 网络安全
FinalShell SSH工具下载,服务器管理,远程桌面加速软件,支持Windows,macOS,Linux
FinalShell是一款国人开发的多平台SSH客户端工具,支持Windows、Mac OS X和Linux系统。它提供一体化服务器管理功能,支持shell和sftp同屏显示,命令自动提示,操作便捷。软件还具备加速功能,提升访问服务器速度,适合普通用户和专业人士使用。
2611 0
|
8月前
|
存储 安全 Linux
Linux服务器上安装配置GitLab的步骤。
按照以上步骤,一个基础的GitLab服务应该运行并可以使用。记得定期检查GitLab官方文档,因为GitLab的安装和配置步骤可能随着新版本而变化。
781 0
|
9月前
|
Linux
Linux下版本控制器(SVN) -服务器端环境搭建步骤
Linux下版本控制器(SVN) -服务器端环境搭建步骤
373 0
Linux下版本控制器(SVN) -服务器端环境搭建步骤