一、方案概述
- 适用系统:麒麟软件 EulerOS/V10(基于RHEL 8)
- 方案原理 :通过
ipset创建IP黑名单集合,结合firewalld富规则实现IP拦截,配合定时任务解析SSH登录日志,自动封禁失败次数超标的IP。 - 核心效果:1小时内SSH登录失败≥3次的IP,自动封禁24小时(可自定义)。
- 优势:无第三方依赖(无需epel/fail2ban),适配麒麟V10原生环境,稳定可靠。
二、前置准备:检查系统基础组件
目的:确保firewalld防火墙和ipset工具已安装并正常运行。
-
检查firewalld状态
bashsystemctl status firewalld预期结果:显示
active (running),若未运行则执行:bashsystemctl enable --now firewalld -
检查ipset工具是否安装
bashyum install -y ipset预期结果:提示"已安装"或"依赖关系解决,无需任何处理"。
-
确认ipset绝对路径(解决crontab找不到命令的问题)
bashwhich ipset预期结果:输出
/usr/sbin/ipset(麒麟V10默认路径)。
三、手动初始化IP黑名单集合与防火墙规则
目的:创建持久化的IP黑名单集合,并配置防火墙拦截规则。
注意:麒麟V10的firewalld不支持
--add-ipset参数,仅需配置富规则即可。
-
创建ipset黑名单集合(超时时间=封禁时长,这里设为86400秒=24小时)
bashipset create ssh_blacklist hash:ip timeout 86400预期结果:无报错,执行
ipset list ssh_blacklist可看到集合信息。 -
添加firewalld富规则,拦截黑名单IP
bashfirewall-cmd --permanent --add-rich-rule="rule family='ipv4' source ipset='ssh_blacklist' drop"预期结果:显示
success,若提示ALREADY_ENABLED说明规则已存在,无需处理。 -
重载防火墙规则,使配置生效
bashfirewall-cmd --reload预期结果:显示
success。
如图:

四、创建自动封禁脚本(适配麒麟V10,解决路径问题)
目的:编写脚本解析SSH登录日志,自动封禁失败次数超标的IP;脚本中使用ipset绝对路径,避免crontab环境变量问题。
-
编写脚本文件(直接复制执行)
bashcat > /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 -
给脚本添加执行权限
bashchmod +x /usr/local/bin/ssh_auto_ban.sh -
手动测试脚本是否正常运行
bash/usr/local/bin/ssh_auto_ban.sh预期结果:无报错,无新IP需要封禁时无输出;可查看日志文件确认:
bashcat /var/log/ssh_ban.log
五、配置定时任务,每分钟自动执行脚本
目的:通过crontab定时运行脚本,实现持续自动防护。
-
编辑定时任务
bashcrontab -e -
添加以下内容(直接复制)
bash* * * * * /usr/local/bin/ssh_auto_ban.sh >> /var/log/ssh_ban.log 2>&1说明:
* * * * *表示每分钟执行一次,>> /var/log/ssh_ban.log 2>&1将脚本输出和错误都写入日志文件。 -
验证定时任务是否添加成功
bashcrontab -l预期结果:显示刚才添加的定时任务行。

六、紧急处理:手动封禁当前恶意IP
目的:快速拦截正在暴力破解的IP(如日志中出现的45.148.10.155)。
-
手动添加IP到黑名单
bashipset add ssh_blacklist 45.148.10.155 timeout 86400预期结果:无报错,执行
ipset list ssh_blacklist可看到该IP出现在Members列表中。
七、验证配置是否完全生效
-
查看黑名单集合中的IP
bashipset list ssh_blacklist预期结果:显示集合信息、超时时间,以及已封禁的IP列表。

-
查看封禁日志,确认脚本运行情况
bashtail -f /var/log/ssh_ban.log预期结果:后续有IP触发失败次数时,会输出封禁记录。
-
验证防火墙规则是否生效
bashfirewall-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_THRESHOLD和BAN_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端口的扫描量,降低被暴力破解的概率。
十、常见问题排查
- 问题 :脚本执行提示
ipset: 未找到命令
解决:确认脚本中IPSET_BIN路径为/usr/sbin/ipset,并手动执行which ipset确认路径正确。 - 问题 :定时任务不执行,日志无输出
解决:检查crontab配置是否正确,确认脚本有执行权限,查看/var/log/cron日志排查错误。 - 问题 :IP被加入黑名单后仍能连接
解决:确认firewalld规则已重载,检查ipset集合是否存在,确认IP是否正确添加到集合中。 - 问题 :麒麟V10执行
firewall-cmd --add-ipset报错
解决:麒麟V10的firewalld不支持该参数,仅需配置富规则即可,无需额外添加ipset。
✅ 至此,我们的麒麟V10服务器已实现SSH自动防暴力破解,后续无需手动干预,脚本会自动处理所有失败登录的IP。