阿里云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
目录
相关文章
|
1月前
|
存储 缓存 弹性计算
阿里云经济型e实例云服务器评测:企业官网搭建的性价比之选
阿里云服务器经济型e实例可以用来搭建企业网站吗?云服务器作为搭建企业官网的基础设施,其性能、稳定性、成本等因素直接影响着官网的运营效果。阿里云经济型e实例云服务器作为一款性价比较高的产品,备受用户关注。许多企业在选择云服务器搭建官网时,都会将其纳入考虑范围。本文将详细探讨阿里云经济型e实例云服务器的特点、性能表现、稳定性与可靠性,以及成本考量,最终解答是否适合用它来搭建企业官网。
|
14天前
|
Ubuntu Linux 网络安全
在Linux云服务器上限制特定IP进行SSH远程连接的设置
温馨提示,修改iptables规则时要格外小心,否则可能导致无法远程访问你的服务器。最好在掌握足够技术知识和理解清楚操作含义之后再进行。另外,在已经配置了防火墙的情况下,例如ufw(Ubuntu Firewall)或firewalld,需要按照相应的防火墙的规则来设置。
67 24
|
28天前
|
存储 机器学习/深度学习 算法
阿里云X86/ARM/GPU/裸金属/超算等五大服务器架构技术特点、场景适配与选型策略
在我们选购阿里云服务器的时候,云服务器架构有X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器、高性能计算可选,有的用户并不清楚他们之间有何区别。本文将深入解析这些架构的特点、优势及适用场景,帮助用户更好地根据实际需求做出选择。
|
1月前
|
存储 开发框架 安全
阿里云轻量应用服务器38元与云服务器99元和199元区别及选择参考
2025年,阿里云推出了多款价格比较实惠的轻量应用服务器和云服务器,这些产品以其卓越的性能和亲民的价格,吸引了众多个人开发者、小型网站以及中小企业的关注。本文将对这几款轻量应用服务器和云服务器进行详细对比和测评,分析其性能和适用场景,以供大家在选择时参考。
|
26天前
|
Go API 定位技术
MCP 实战:用 Go 语言开发一个查询 IP 信息的 MCP 服务器
随着 MCP 的快速普及和广泛应用,MCP 服务器也层出不穷。大多数开发者使用的 MCP 服务器开发库是官方提供的 typescript-sdk,而作为 Go 开发者,我们也可以借助优秀的第三方库去开发 MCP 服务器,例如 ThinkInAIXYZ/go-mcp。 本文将详细介绍如何在 Go 语言中使用 go-mcp 库来开发一个查询 IP 信息的 MCP 服务器。
89 0
|
2天前
|
Ubuntu Linux
"unzip"命令解析:Linux下如何处理压缩文件。
总的来说,`unzip`命令是Linux系统下一款实用而方便的ZIP格式文件处理工具。本文通过简明扼要的方式,详细介绍了在各类Linux发行版上安装 `unzip`的方法,以及如何使用 `unzip`命令进行解压、查看和测试ZIP文件。希望本文章能为用户带来实际帮助,提高日常操作的效率。
31 12
|
11天前
|
缓存 Linux 数据安全/隐私保护
Linux环境下如何通过手动调用drop_caches命令释放内存
总的来说,记录住“drop_caches” 命令并理解其含义,可以让你在日常使用Linux的过程中更加娴熟和自如。
64 23
|
10天前
|
消息中间件 NoSQL Linux
Redis的基本介绍和安装方式(包括Linux和Windows版本),以及常用命令的演示
Redis(Remote Dictionary Server)是一个高性能的开源键值存储数据库。它支持字符串、列表、散列、集合等多种数据类型,具有持久化、发布/订阅等高级功能。由于其出色的性能和广泛的使用场景,Redis在应用程序中常作为高速缓存、消息队列等用途。
107 16
|
2月前
|
Linux
linux命令详细说明以及案例
本文介绍了常用的 Linux 命令及其详细说明和示例,包括:`ls`(列出目录内容)、`cd`(更改目录)、`rm` 和 `mv`(删除与移动文件)、`grep`(搜索文本)、`cat`(显示文件内容)以及 `chmod`(更改文件权限)。每个命令均配有功能描述、选项说明及实际案例,帮助用户更好地掌握 Linux 命令的使用方法。
180 56
|
1月前
|
Linux 定位技术
Linux系统中的cd命令:目录切换技巧
踏过千山,越过万水,人生就是一场不断前行的旅程,总充满了未知与挑战。然而,“cd”命令如同你的旅伴,会带你穿梭在如棋盘一般的文件系统中,探索每一处未知。希望你能从“cd”命令中找到乐趣,像是掌控了一种络新妙的魔法,去向未知进发,开始你的探索之旅。
129 24