必须立即配置Fail2ban自动封禁SSH暴力破解IP:先验证Python 3.7+和systemd可用,再apt安装并启用服务;复制jail.conf为jail.local,启用sshd jail且设maxretry=3、bantime=3600;指定firewalld为banaction后端;最后模拟攻击验证封禁生效。

如果你的银河麒麟OS服务器正被大量SSH暴力破解请求冲击,日志里频繁出现“Failed password for”记录,必须立即配置Fail2ban实现自动封禁异常IP,否则攻击者可能在几小时内撞出密码。
确认系统基础环境可用
Fail2ban依赖Python 3和systemd,麒麟OS V10 SP1+默认满足,但必须实测验证——有些定制版镜像会精简掉python3-distutils等关键模块。
执行python3 --version,确保输出为Python 3.7或更高版本;若报错“command not found”,需先运行sudo apt install python3 python3-pip -y。
执行systemctl --version,确认返回含systemd版本号且无error;若提示未安装,说明系统严重异常,不可继续。
最后执行sudo apt update更新软件源索引,避免后续安装失败。
安装并启用Fail2Ban服务
麒麟OS基于Debian/Ubuntu体系,直接使用APT安装最稳妥,能自动解决依赖签名与架构兼容性问题。
运行sudo apt install fail2ban -y,等待安装完成。
安装后检查服务是否已设为开机自启:sudo systemctl is-enabled fail2ban,若返回disabled,立刻执行sudo systemctl enable fail2ban。
启动服务:sudo systemctl start fail2ban,再用sudo systemctl status fail2ban确认状态为active (running)——如果卡在activating或failed,大概率是Python模块缺失,需回退上一步检查。
启用SSH防护规则
Fail2ban默认不启用任何jail,必须手动激活sshd模块并设定合理阈值,否则服务只是空转。
第一步:创建本地配置副本,避免升级时被覆盖:sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local。
第二步:编辑配置文件:sudo nano /etc/fail2ban/jail.local。
第三步:定位到[sshd]段落,取消以下三行注释并修改:enabled = truemaxretry = 3bantime = 3600
【bantime设为3600秒(1小时)是关键平衡点:太短(如60秒)会让高频扫描器反复试探,太长(如1周)极易误封内网运维IP】
保存退出后,执行sudo fail2ban-client reload重载配置,让规则立即生效。
配置firewalld为封禁后端
麒麟OS默认使用firewalld而非iptables,Fail2ban若未指定后端,封禁指令将静默失败,IP照常访问。
方法一:修改全局动作后端
执行sudo nano /etc/fail2ban/jail.local,在文件末尾新增:[DEFAULT]banaction = firewallcmd-ipsetaction = %(action_mwl)s
方法二:单独为sshd指定后端(更精准)
在同一文件中找到[sshd]段落,添加一行:banaction = firewallcmd-ipset
保存后,重启firewalld确保其运行:sudo systemctl restart firewalld。
测试封禁是否写入防火墙:sudo fail2ban-client set sshd banip 192.168.1.100,再执行sudo firewall-cmd --list-rich-rules | grep 192.168.1.100,若返回包含reject规则的行,说明后端配置成功。
验证防护效果
这一步必须做,不能跳过——很多用户配置完以为万事大吉,其实fail2ban根本没真正拦截过IP。
第一步:清空当前fail2ban状态,避免旧数据干扰:sudo fail2ban-client unban --all。
第二步:模拟一次暴力破解(用另一台机器执行):ssh -o ConnectTimeout=5 -o NumberOfPasswordPrompts=1 user@your_server_ip,连续输错密码3次。
第三步:查看实时封禁日志:sudo tail -f /var/log/fail2ban.log,等待出现Found ... for sshd及Ban 192.168.x.x字样。
第四步:确认该IP已被firewalld拦截:sudo firewall-cmd --list-rich-rules | grep "192.168.x.x",有输出即成功。
第五步:尝试从被封IP再次SSH连接,应直接超时或拒绝连接——此时防护闭环已完成。

















