SSH 登录失败自动封锁工具

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

工具介绍#

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

工具功能#

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

工具组件#

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

安装步骤#

1. 准备文件#

将以下文件复制到服务器上:

  • block_ssh_failures.sh - 主脚本
  • ssh-blocker.service - systemd 服务文件
  • ssh-blocker.timer - systemd 定时器文件

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

Terminal window
# 创建脚本目录
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. 设置脚本执行权限#

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

4. 重新加载 systemd 配置#

Terminal window
sudo systemctl daemon-reload

5. 启动并启用定时器#

Terminal window
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 分钟执行一次

管理命令#

查看定时器状态#

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/ssh_blocker/block_ssh_failures.sh

工作原理#

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

注意事项#

  • 运行权限:脚本需要以 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 暴力破解攻击的风险。通过定期执行检测脚本,我们可以及时发现并阻止可疑的登录尝试,提高服务器的安全性。

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

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

完整源码#

1. block_ssh_failures.sh#

#!/bin/sh
# 检查是否以root用户运行
if [ "`id -u`" -ne 0 ]; then
echo "请以root用户运行此脚本"
exit 1
fi
# 配置参数
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
fi
done

2. ssh-blocker.service#

[Unit]
Description=SSH登录失败IP封锁服务
After=network.target
[Service]
Type=oneshot
ExecStart=/root/ssh_blocker/block_ssh_failures.sh
User=root
[Install]
WantedBy=multi-user.target

3. ssh-blocker.timer#

[Unit]
Description=定期检查SSH登录失败并封锁IP
[Timer]
OnCalendar=*:0/1
Persistent=true
[Install]
WantedBy=timers.target

文章分享

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

SSH 登录失败自动封锁工具
https://blog.cllll.link/posts/ssh-blocker-tool/
作者
clll
发布于
2026-03-12
许可协议
CC BY-NC-SA 4.0
最后更新于 2026-03-12,距今已过 70 天

部分内容可能已过时

Profile Image of the Author
clll
Hello, I'm clll.
公告
Hello, World!
音乐
封面

音乐

暂未播放

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

目录