SSH 登录失败自动封锁工具
1284 字
6 分钟
SSH 登录失败自动封锁工具
工具介绍
在服务器管理中,SSH 暴力破解攻击是一个常见的安全威胁。攻击者会尝试使用各种用户名和密码组合来登录服务器,这不仅会占用服务器资源,还可能导致安全漏洞。为了解决这个问题,我开发了一款 SSH 登录失败自动封锁工具,能够自动检测并封锁多次登录失败的 IP 地址。
工具功能
- 自动检测:定期检查 SSH 登录失败记录
- 智能封锁:自动封锁登录失败超过阈值的 IP 地址
- 易于配置:可调整失败次数阈值和检查频率
- 低资源占用:使用轻量级脚本,不影响服务器性能
- 无需修改防火墙:使用
/etc/hosts.deny文件进行封锁,避免复杂的防火墙配置
工具组件
block_ssh_failures.sh- 主脚本,用于检测 SSH 登录失败并封锁 IPssh-blocker.service- systemd 服务文件ssh-blocker.timer- systemd 定时器文件,设置每 1 分钟运行一次
安装步骤
1. 准备文件
将以下文件复制到服务器上:
block_ssh_failures.sh- 主脚本ssh-blocker.service- systemd 服务文件ssh-blocker.timer- systemd 定时器文件
2. 复制文件到目标位置
# 创建脚本目录sudo mkdir -p /root/ssh_blocker
# 复制文件sudo cp block_ssh_failures.sh /root/ssh_blocker/sudo cp ssh-blocker.service /etc/systemd/system/sudo cp ssh-blocker.timer /etc/systemd/system/3. 设置脚本执行权限
sudo chmod +x /root/ssh_blocker/block_ssh_failures.sh4. 重新加载 systemd 配置
sudo systemctl daemon-reload5. 启动并启用定时器
sudo systemctl enable --now ssh-blocker.timer配置调整
脚本参数调整
编辑 /root/ssh_blocker/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/1- 每 1 分钟执行一次
管理命令
查看定时器状态
sudo systemctl list-timers | grep ssh-blocker查看服务状态
sudo systemctl status ssh-blocker.service查看封锁的 IP
sudo grep sshd /etc/hosts.deny手动执行脚本
sudo /root/ssh_blocker/block_ssh_failures.sh工作原理
- 日志分析:脚本通过
journalctl获取 SSH 服务的登录失败记录 - IP 提取:从日志中提取失败登录的 IP 地址并统计次数
- 阈值检查:对失败次数超过阈值的 IP 进行标记
- IP 封锁:将标记的 IP 添加到
hosts.deny文件中 - 定期执行:通过 systemd 定时器每 1 分钟执行一次此操作
注意事项
- 运行权限:脚本需要以 root 用户运行
- 系统要求:系统需要启用 TCP Wrappers(Ubuntu 默认已启用)
- 定期检查:建议定期检查
hosts.deny文件,避免误封 - 解除封锁:如需解除封锁,可编辑
/etc/hosts.deny文件删除相应条目 - 适用环境:此工具适用于 Ubuntu 24 环境,其他 Linux 发行版可能需要适当调整
安全建议
除了使用此工具外,还建议采取以下安全措施:
- 使用密钥登录:禁用密码登录,使用 SSH 密钥进行认证
- 更改默认端口:将 SSH 端口从默认的 22 更改为其他端口
- 使用防火墙:配置防火墙,只允许特定 IP 访问 SSH 端口
- 定期更新:保持系统和 SSH 服务的更新
- 监控日志:定期查看 SSH 登录日志,及时发现异常情况
总结
SSH 登录失败自动封锁工具是一款简单但有效的安全工具,能够帮助服务器管理员自动检测并封锁恶意 IP 地址,减少 SSH 暴力破解攻击的风险。通过定期执行检测脚本,我们可以及时发现并阻止可疑的登录尝试,提高服务器的安全性。
该工具使用了轻量级的实现方式,不需要复杂的配置,适合各种规模的服务器环境。同时,它也提供了灵活的配置选项,可以根据实际需求调整检测参数和执行频率。
希望这款工具能够帮助您更好地保护服务器安全,减少安全隐患。
完整源码
1. block_ssh_failures.sh
#!/bin/sh
# 检查是否以root用户运行if [ "`id -u`" -ne 0 ]; then echo "请以root用户运行此脚本" exit 1fi
# 配置参数THRESHOLD=5 # 失败次数阈值TIME_RANGE="1 day ago" # 检查时间范围HOSTS_DENY="/etc/hosts.deny" # hosts.deny文件路径
# 获取SSH失败登录的IP地址及其次数FAILED_IPS=`journalctl _SYSTEMD_UNIT=ssh.service --grep "Failed password" --since "$TIME_RANGE" | \ grep -Eo 'from ([0-9]{1,3}\.){3}[0-9]{1,3}' | \ awk '{print $2}' | \ sort | \ uniq -c | \ sort -nr`
# 遍历每个IP及其失败次数echo "$FAILED_IPS" | while read COUNT IP; do # 跳过本地回环地址 if echo "$IP" | grep -q "^127\."; then continue fi
# 检查是否超过阈值 if [ "$COUNT" -ge "$THRESHOLD" ]; then # 检查IP是否已在hosts.deny中 if ! grep -q "sshd:$IP" "$HOSTS_DENY"; then # 添加到hosts.deny echo "sshd:$IP" >> "$HOSTS_DENY" echo "已在hosts.deny中封锁IP $IP,在过去 $TIME_RANGE 内有 $COUNT 次失败登录尝试" fi fidone2. ssh-blocker.service
[Unit]Description=SSH登录失败IP封锁服务After=network.target
[Service]Type=oneshotExecStart=/root/ssh_blocker/block_ssh_failures.shUser=root
[Install]WantedBy=multi-user.target3. ssh-blocker.timer
[Unit]Description=定期检查SSH登录失败并封锁IP
[Timer]OnCalendar=*:0/1Persistent=true
[Install]WantedBy=timers.target文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
SSH 登录失败自动封锁工具
https://blog.cllll.link/posts/ssh-blocker-tool/ 最后更新于 2026-03-12,距今已过 70 天
部分内容可能已过时
相关文章 智能推荐
1
DNS查询利器:dig工具完全指南
技术教程 详细介绍 DNS 查询工具 dig 的使用方法、输出解读和网络诊断技巧。
2
Dirty Frag(通用 Linux 本地提权漏洞)加固
安全研究 关于 Dirty Frag 通用 Linux 本地提权漏洞的加固指南
3
安服驻场指南:应急响应
安全研究 详细介绍安全服务人员驻场应急响应的完整流程、排查方法和报告编写规范。
4
Copy Fail(CVE-2026-31431)加固
安全研究 关于 CVE-2026-31431 Copy Fail 漏洞的加固指南
5
macOS nettop 工具指南
技术教程 详细介绍 macOS 系统中 nettop 命令的使用方法、输出解读和网络诊断技巧。
随机文章 随机推荐