SSH 登录失败自动封锁工具

1140 字
6 分钟
SSH 登录失败自动封锁工具

工具介绍#

在服务器管理中,SSH 暴力破解攻击是一个常见的安全威胁。攻击者会尝试使用各种用户名和密码组合来登录服务器,这不仅会占用服务器资源,还可能导致安全漏洞。为了解决这个问题,我开发了一款 SSH 登录失败自动封锁工具,能够自动检测并封锁多次登录失败的 IP 地址。

工具功能#

  • 自动检测:定期检查 SSH 登录失败记录
  • 智能封锁:自动封锁登录失败超过阈值的 IP 地址
  • 易于配置:可调整失败次数阈值和检查频率
  • 低资源占用:使用轻量级脚本,不影响服务器性能
  • 无需修改防火墙:使用 /etc/hosts.deny 文件进行封锁,避免复杂的防火墙配置

工具组件#

  • block_ssh_failures.sh - 主脚本,用于检测 SSH 登录失败并封锁 IP
  • ssh-blocker.service - systemd 服务文件
  • ssh-blocker.timer - systemd 定时器文件,设置每 10 分钟运行一次

安装步骤#

1. 复制文件到目标位置#

Terminal window
sudo cp block_ssh_failures.sh /root/
sudo cp ssh-blocker.service /etc/systemd/system/
sudo cp ssh-blocker.timer /etc/systemd/system/

2. 设置脚本执行权限#

Terminal window
sudo chmod +x /root/block_ssh_failures.sh

3. 重新加载 systemd 配置#

Terminal window
sudo systemctl daemon-reload

4. 启动并启用定时器#

Terminal window
sudo systemctl enable --now ssh-blocker.timer

配置调整#

脚本参数调整#

编辑 /root/block_ssh_failures.sh 文件,可以调整以下参数:

  • THRESHOLD=5 - 失败次数阈值,超过此值将被封锁
  • TIME_RANGE="1 day ago" - 检查时间范围
  • HOSTS_DENY="/etc/hosts.deny" - hosts.deny 文件路径

定时器调整#

编辑 /etc/systemd/system/ssh-blocker.timer 文件,可以调整执行频率:

  • OnCalendar=*:0/10 - 每 10 分钟执行一次

管理命令#

查看定时器状态#

Terminal window
sudo systemctl list-timers | grep ssh-blocker

查看服务状态#

Terminal window
sudo systemctl status ssh-blocker.service

查看封锁的 IP#

Terminal window
sudo grep sshd /etc/hosts.deny

手动执行脚本#

Terminal window
sudo /root/block_ssh_failures.sh

工作原理#

  1. 日志分析:脚本通过 journalctl 获取 SSH 服务的登录失败记录
  2. IP 提取:从日志中提取失败登录的 IP 地址并统计次数
  3. 阈值检查:对失败次数超过阈值的 IP 进行标记
  4. IP 封锁:将标记的 IP 添加到 hosts.deny 文件中
  5. 定期执行:通过 systemd 定时器每 10 分钟执行一次此操作

技术实现#

核心检测逻辑#

脚本的核心逻辑是通过分析系统日志来识别 SSH 登录失败的 IP 地址:

Terminal window
# 提取 SSH 登录失败的 IP 地址
failures=$(journalctl --since "$TIME_RANGE" -u ssh --grep "Failed password" | grep -E "from [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" | awk '{print $11}' | sort | uniq -c)
# 检查并封锁超过阈值的 IP
while read -r count ip; do
if [ "$count" -ge "$THRESHOLD" ]; then
# 检查 IP 是否已在 hosts.deny 中
if ! grep -q "sshd:$ip" "$HOSTS_DENY"; then
echo "sshd:$ip" >> "$HOSTS_DENY"
echo "Blocked IP $ip with $count failed attempts"
fi
fi
done <<< "$failures"

systemd 配置#

通过 systemd 定时器,我们可以定期执行脚本,确保系统持续受到保护:

# ssh-blocker.timer
[Unit]
Description=SSH Blocker Timer
[Timer]
OnCalendar=*:0/10
Persistent=true
[Install]
WantedBy=timers.target

注意事项#

  • 运行权限:脚本需要以 root 用户运行
  • 系统要求:系统需要启用 TCP Wrappers(Ubuntu 默认已启用)
  • 定期检查:建议定期检查 hosts.deny 文件,避免误封
  • 解除封锁:如需解除封锁,可编辑 /etc/hosts.deny 文件删除相应条目
  • 适用环境:此工具适用于 Ubuntu 24 环境,其他 Linux 发行版可能需要适当调整

安全建议#

除了使用此工具外,还建议采取以下安全措施:

  1. 使用密钥登录:禁用密码登录,使用 SSH 密钥进行认证
  2. 更改默认端口:将 SSH 端口从默认的 22 更改为其他端口
  3. 使用防火墙:配置防火墙,只允许特定 IP 访问 SSH 端口
  4. 定期更新:保持系统和 SSH 服务的更新
  5. 监控日志:定期查看 SSH 登录日志,及时发现异常情况

总结#

SSH 登录失败自动封锁工具是一款简单但有效的安全工具,能够帮助服务器管理员自动检测并封锁恶意 IP 地址,减少 SSH 暴力破解攻击的风险。通过定期执行检测脚本,我们可以及时发现并阻止可疑的登录尝试,提高服务器的安全性。

该工具使用了轻量级的实现方式,不需要复杂的配置,适合各种规模的服务器环境。同时,它也提供了灵活的配置选项,可以根据实际需求调整检测参数和执行频率。

希望这款工具能够帮助您更好地保护服务器安全,减少安全隐患。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

SSH 登录失败自动封锁工具
https://blog.cllll.link/posts/ssh-blocker-tool/
作者
clll
发布于
2026-03-12
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
clll
Hello, I'm clll.
公告
hello,world
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
3
分类
2
标签
9
总字数
3,539
运行时长
0
最后活动
0 天前

目录