【麒麟V10系统 SSH自动防暴力破解(失败3次封IP)完整配置笔记】


一、方案概述

  • 适用系统:麒麟软件 EulerOS/V10(基于RHEL 8)
  • 方案原理 :通过ipset创建IP黑名单集合,结合firewalld富规则实现IP拦截,配合定时任务解析SSH登录日志,自动封禁失败次数超标的IP。
  • 核心效果:1小时内SSH登录失败≥3次的IP,自动封禁24小时(可自定义)。
  • 优势:无第三方依赖(无需epel/fail2ban),适配麒麟V10原生环境,稳定可靠。

二、前置准备:检查系统基础组件

目的:确保firewalld防火墙和ipset工具已安装并正常运行。

  1. 检查firewalld状态

    bash 复制代码
    systemctl status firewalld

    预期结果:显示active (running),若未运行则执行:

    bash 复制代码
    systemctl enable --now firewalld
  2. 检查ipset工具是否安装

    bash 复制代码
    yum install -y ipset

    预期结果:提示"已安装"或"依赖关系解决,无需任何处理"。

  3. 确认ipset绝对路径(解决crontab找不到命令的问题)

    bash 复制代码
    which ipset

    预期结果:输出/usr/sbin/ipset(麒麟V10默认路径)。


三、手动初始化IP黑名单集合与防火墙规则

目的:创建持久化的IP黑名单集合,并配置防火墙拦截规则。

注意:麒麟V10的firewalld不支持--add-ipset参数,仅需配置富规则即可。

  1. 创建ipset黑名单集合(超时时间=封禁时长,这里设为86400秒=24小时)

    bash 复制代码
    ipset create ssh_blacklist hash:ip timeout 86400

    预期结果:无报错,执行ipset list ssh_blacklist可看到集合信息。

  2. 添加firewalld富规则,拦截黑名单IP

    bash 复制代码
    firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source ipset='ssh_blacklist' drop"

    预期结果:显示success,若提示ALREADY_ENABLED说明规则已存在,无需处理。

  3. 重载防火墙规则,使配置生效

    bash 复制代码
    firewall-cmd --reload

    预期结果:显示success
    如图:


四、创建自动封禁脚本(适配麒麟V10,解决路径问题)

目的:编写脚本解析SSH登录日志,自动封禁失败次数超标的IP;脚本中使用ipset绝对路径,避免crontab环境变量问题。

  1. 编写脚本文件(直接复制执行)

    bash 复制代码
    cat > /usr/local/bin/ssh_auto_ban.sh << 'EOF'
    #!/bin/bash
    # 配置项 - 可根据需求修改
    LOG_PATH="/var/log/secure"          # SSH登录日志路径(麒麟V10默认)
    IPSET_NAME="ssh_blacklist"         # ipset黑名单集合名称
    FAIL_THRESHOLD=3                   # 登录失败次数阈值(≥3次封禁)
    BAN_SECONDS=86400                  # 封禁时长(单位:秒,86400=24小时)
    IPSET_BIN="/usr/sbin/ipset"        # ipset命令绝对路径(避免crontab找不到)
    
    # 1. 初始化日志文件(若不存在)
    if [ ! -f /var/log/ssh_ban.log ]; then
        touch /var/log/ssh_ban.log
        chmod 644 /var/log/ssh_ban.log
    fi
    
    # 2. 初始化ipset集合(若不存在)
    if ! $IPSET_BIN list $IPSET_NAME >/dev/null 2>&1; then
        $IPSET_BIN create $IPSET_NAME hash:ip timeout $BAN_SECONDS
        firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source ipset='$IPSET_NAME' drop"
        firewall-cmd --reload
    fi
    
    # 3. 解析SSH日志,统计失败登录IP并封禁
    grep "Failed password for" $LOG_PATH | awk '{print $(NF-3)}' | sort | uniq -c | while read count ip
    do
        if [ $count -ge $FAIL_THRESHOLD ]; then
            echo "[$(date "+%Y-%m-%d %H:%M:%S")] 封禁暴力破解IP: $ip (失败次数: $count)" >> /var/log/ssh_ban.log
            $IPSET_BIN add $IPSET_NAME $ip timeout $BAN_SECONDS 2>/dev/null
        fi
    done
    EOF
  2. 给脚本添加执行权限

    bash 复制代码
    chmod +x /usr/local/bin/ssh_auto_ban.sh
  3. 手动测试脚本是否正常运行

    bash 复制代码
    /usr/local/bin/ssh_auto_ban.sh

    预期结果:无报错,无新IP需要封禁时无输出;可查看日志文件确认:

    bash 复制代码
    cat /var/log/ssh_ban.log

五、配置定时任务,每分钟自动执行脚本

目的:通过crontab定时运行脚本,实现持续自动防护。

  1. 编辑定时任务

    bash 复制代码
    crontab -e
  2. 添加以下内容(直接复制)

    bash 复制代码
    * * * * * /usr/local/bin/ssh_auto_ban.sh >> /var/log/ssh_ban.log 2>&1

    说明:* * * * *表示每分钟执行一次,>> /var/log/ssh_ban.log 2>&1将脚本输出和错误都写入日志文件。

  3. 验证定时任务是否添加成功

    bash 复制代码
    crontab -l

    预期结果:显示刚才添加的定时任务行。


六、紧急处理:手动封禁当前恶意IP

目的:快速拦截正在暴力破解的IP(如日志中出现的45.148.10.155)。

  1. 手动添加IP到黑名单

    bash 复制代码
    ipset add ssh_blacklist 45.148.10.155 timeout 86400

    预期结果:无报错,执行ipset list ssh_blacklist可看到该IP出现在Members列表中。


七、验证配置是否完全生效

  1. 查看黑名单集合中的IP

    bash 复制代码
    ipset list ssh_blacklist

    预期结果:显示集合信息、超时时间,以及已封禁的IP列表。

  2. 查看封禁日志,确认脚本运行情况

    bash 复制代码
    tail -f /var/log/ssh_ban.log

    预期结果:后续有IP触发失败次数时,会输出封禁记录。

  3. 验证防火墙规则是否生效

    bash 复制代码
    firewall-cmd --list-rich-rules

    预期结果:包含rule family="ipv4" source ipset="ssh_blacklist" drop规则。


八、日常维护与管理命令

操作 命令
查看所有被封禁的IP ipset list ssh_blacklist
手动解封某个IP ipset del ssh_blacklist 45.148.10.155
清空所有封禁IP ipset flush ssh_blacklist
排查定时任务执行日志 tail -f /var/log/cron
修改封禁次数/时长 编辑/usr/local/bin/ssh_auto_ban.sh中的FAIL_THRESHOLDBAN_SECONDS,无需重启服务

九、额外安全加固(可选,推荐配置)

1. 禁止root用户直接SSH登录

  • 编辑配置文件:vi /etc/ssh/sshd_config
  • 修改参数:PermitRootLogin no
  • 重启SSH服务:systemctl restart sshd
  • 说明:禁止root直接登录后,只能用普通用户登录,再通过sudo su -切换root,避免root账号被暴力破解。

2. 限制SSH登录IP白名单(仅办公IP可连接)

  • 编辑/etc/hosts.allow:添加sshd: 你的办公IP/网段
  • 编辑/etc/hosts.deny:添加sshd: ALL
  • 说明:仅白名单IP可发起SSH连接,从根源拦截公网扫描。

3. 修改SSH默认端口(可选)

  • 编辑/etc/ssh/sshd_config,修改Port 22为自定义端口(如22222)
  • 防火墙放行新端口:firewall-cmd --permanent --add-port=22222/tcp && firewall-cmd --reload
  • 重启SSH服务:systemctl restart sshd
  • 说明:减少默认22端口的扫描量,降低被暴力破解的概率。

十、常见问题排查

  1. 问题 :脚本执行提示ipset: 未找到命令
    解决:确认脚本中IPSET_BIN路径为/usr/sbin/ipset,并手动执行which ipset确认路径正确。
  2. 问题 :定时任务不执行,日志无输出
    解决:检查crontab配置是否正确,确认脚本有执行权限,查看/var/log/cron日志排查错误。
  3. 问题 :IP被加入黑名单后仍能连接
    解决:确认firewalld规则已重载,检查ipset集合是否存在,确认IP是否正确添加到集合中。
  4. 问题 :麒麟V10执行firewall-cmd --add-ipset报错
    解决:麒麟V10的firewalld不支持该参数,仅需配置富规则即可,无需额外添加ipset。

✅ 至此,我们的麒麟V10服务器已实现SSH自动防暴力破解,后续无需手动干预,脚本会自动处理所有失败登录的IP。

相关推荐
情绪总是阴雨天~1 小时前
Flask Web 开发入门笔记
笔记·flask
今儿敲了吗1 小时前
数据库(四)——关系数据库SQL语言
数据库·笔记·sql
问心无愧05131 小时前
ctf show web入门31
前端·笔记
远离UE41 小时前
Forward+ & Deferred+学习笔记
笔记·数码相机·学习
sz4972385991 小时前
双网卡通过路由器实现外网和内网同时上网
网络·tcp/ip·智能路由器·hmi
Hua-Jay1 小时前
OpenCV联合C++/Qt 学习笔记(十六)----图像细化、轮廓检测、轮廓信息统计及轮廓外接多边形
c++·笔记·qt·opencv·学习·计算机视觉
谙弆悕博士1 小时前
Fortran学习笔记
经验分享·笔记·学习·职场和发展·跳槽·学习方法·fortran
50万马克的面包2 小时前
C语言:三大基础排序算法模板 冒泡 / 选择 / 插入)
c语言·笔记·算法·排序算法
IT菜鸟程2 小时前
Linux 系统安全加固实战:从密码策略到 SSH 访问控制
linux·ssh·系统安全