SSH(Secure Shell)作为远程管理服务器的核心工具,其安全性直接关系到整个服务器系统的稳定与数据安全。然而,随着自动化攻击工具的普及,SSH 暴力破解已成为运维人员日常面临的高频威胁——黑客通过脚本批量尝试用户名和密码组合,一旦成功即可获得服务器控制权,进而引发数据泄露、勒索攻击等严重后果。
作为运维工程师,与其被动等待攻击发生,不如主动构建多维度防御体系。本文将从端口优化、认证机制升级、访问控制、日志监控等方面,分享6个可落地的实用技巧,帮你彻底堵死 SSH 暴力破解的漏洞。
一、隐藏 SSH 默认端口:让攻击“找不到门”
SSH 默认使用 22 端口,这是所有黑客攻击工具的“第一目标”。将默认端口改为非标准端口,虽然不能完全阻止攻击,但能过滤掉90%以上的自动化扫描——毕竟大多数脚本只会针对 22 端口狂轰滥炸。
操作步骤:
-
修改 SSH 配置文件
编辑/etc/ssh/sshd_config文件,找到Port 22这一行(若被注释则取消注释),将 22 改为一个未被占用的高位端口(建议选择 10000-65535 之间,如 23456):Port 23456注意:避免使用知名服务端口(如 80、443、3306 等),防止端口冲突。
-
开放新端口的防火墙规则
以ufw防火墙为例,先允许新端口的 SSH 流量,再删除默认 22 端口的规则:
ufw allow 23456/tcp ufw delete allow 22/tcp ufw reload # 重新加载防火墙规则若使用
iptables,则执行:iptables -A INPUT -p tcp --dport 23456 -j ACCEPT iptables -D INPUT -p tcp --dport 22 -j ACCEPT service iptables save # 保存规则 -
重启 SSH 服务生效
systemctl restart sshd # CentOS/RHEL # 或 systemctl restart ssh # Ubuntu/Debian
注意事项:
- 改端口后,远程连接时需指定端口(如
ssh root@192.168.1.100 -p 23456); - 若服务器有安全组(如阿里云、AWS),需同步在安全组中开放新端口,否则连接会被阻断。
二、禁用密码登录:从根源切断暴力破解可能
密码登录是暴力破解的“重灾区”——即使密码复杂度高,也可能被字典攻击或彩虹表破解。而SSH 密钥对认证通过非对称加密(公钥存服务器,私钥存本地)实现身份验证,无需输入密码,且私钥无法被暴力破解,安全性提升数个量级。
操作步骤:
-
生成密钥对(本地电脑操作)
打开本地终端,执行ssh-keygen命令生成密钥对(默认保存到~/.ssh/id_rsa和~/.ssh/id_rsa.pub):ssh-keygen -t rsa -b 4096 # 4096位密钥更安全过程中按回车即可(无需设置密码,若需双重保障可设置密钥密码)。
-
将公钥上传至服务器
使用ssh-copy-id命令快速上传公钥(需先通过密码登录服务器):ssh-copy-id -p 23456 root@192.168.1.100 # 替换为你的端口和服务器IP若
ssh-copy-id不可用,可手动复制本地id_rsa.pub内容,粘贴到服务器的~/.ssh/authorized_keys文件中。 -
禁用密码登录
编辑服务器的/etc/ssh/sshd_config文件,修改以下参数:PasswordAuthentication no # 禁用密码登录 PubkeyAuthentication yes # 启用密钥认证 ChallengeResponseAuthentication no # 禁用挑战响应认证(如PAM) -
重启 SSH 服务
systemctl restart sshd
验证:
断开当前连接,重新尝试用密码登录(如 ssh root@192.168.1.100 -p 23456),若提示“Permission denied”则说明配置生效。
三、限制登录用户:只允许“信任名单”访问
服务器上可能存在多个用户(如 root、www、ftp 等),但并非所有用户都需要 SSH 访问权限。通过限制允许登录的用户,可减少攻击面——即使黑客猜到用户名,若不在允许列表中也无法登录。
操作步骤:
编辑 /etc/ssh/sshd_config 文件,添加或修改 AllowUsers 字段,指定允许 SSH 登录的用户(多个用户用空格分隔):

AllowUsers admin user1 # 仅允许admin和user1登录
若需要限制用户从特定 IP 登录(如仅允许公司办公网 IP),可这样写:
AllowUsers admin@192.168.1.0/24 user1@10.0.0.5 # admin允许192.168.1段,user1仅允许10.0.0.5
补充:禁用 root 直接登录
root 是服务器的最高权限用户,若被破解后果不堪设想。建议创建一个普通用户(如 admin),授予 sudo 权限,然后禁用 root 的 SSH 登录:
# 1. 创建普通用户
useradd admin
passwd admin # 设置密码(若已用密钥可忽略)
# 2. 授予sudo权限
usermod -aG sudo admin # Ubuntu/Debian
# 或
usermod -aG wheel admin # CentOS/RHEL
# 3. 编辑sshd_config禁用root登录
PermitRootLogin no
重启 SSH 服务后,root 将无法直接登录,需先用 admin 登录,再通过 sudo su - 切换到 root。
四、用 Fail2ban 自动封禁恶意 IP
即使做了上述配置,仍可能有黑客尝试暴力破解(比如针对新端口扫描)。Fail2ban 是一款入侵防御工具,能监控 SSH 日志,自动封禁多次失败登录的 IP,相当于给服务器加了一道“动态防火墙”。
安装与配置:
-
安装 Fail2ban
# Ubuntu/Debian apt update && apt install fail2ban -y # CentOS/RHEL yum install epel-release -y yum install fail2ban -y -
配置 SSH 防护规则
复制默认配置文件(避免直接修改原文件):cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local编辑
jail.local,找到[sshd]段落,修改为:[sshd] enabled = true # 启用规则 port = 23456 # 改为你的SSH端口 filter = sshd # 使用内置的sshd过滤规则 logpath = /var/log/auth.log # Ubuntu/Debian日志路径 # logpath = /var/log/secure # CentOS/RHEL日志路径 maxretry = 3 # 失败3次后封禁 bantime = 86400 # 封禁时间(秒),这里是24小时 ignoreip = 127.0.0.1/8 192.168.1.0/24 # 忽略本地和信任IP段 -
启动并设置开机自启
systemctl start fail2ban systemctl enable fail2ban
常用命令:
- 查看被封禁的 IP:
fail2ban-client status sshd - 手动解封 IP:
fail2ban-client set sshd unbanip 1.2.3.4 - 查看 Fail2ban 日志:
tail -f /var/log/fail2ban.log
五、加强防火墙规则:只允许信任 IP 访问
防火墙是服务器的第一道防线。除了开放 SSH 端口,还应限制只有信任的 IP(如公司办公网、个人电脑 IP)才能访问 SSH,彻底拒绝陌生 IP 的连接请求。
以 UFW 为例配置:
-
默认拒绝所有入站流量
ufw default deny incoming ufw default allow outgoing -
允许信任 IP 访问 SSH
ufw allow from 192.168.1.0/24 to any port 23456 proto tcp # 公司办公网段 ufw allow from 10.0.0.5 to any port 23456 proto tcp # 个人电脑固定IP -
启用 UFW
ufw enable ufw status # 查看规则
以 iptables 为例配置:
# 清空现有规则
iptables -F
# 允许信任IP访问SSH
iptables -A INPUT -p tcp --dport 23456 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 23456 -s 10.0.0.5 -j ACCEPT
# 拒绝其他所有IP访问SSH
iptables -A INPUT -p tcp --dport 23456 -j DROP
# 允许回环接口和已建立的连接
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# 保存规则
service iptables save
六、实时监控 SSH 日志:及时发现异常
日志是运维人员的“眼睛”。通过监控 SSH 登录日志,能第一时间发现异常登录尝试,甚至在攻击造成损失前介入处理。
关键日志位置:
- Ubuntu/Debian:
/var/log/auth.log - CentOS/RHEL:
/var/log/secure
常用监控命令:
-
实时查看日志
tail -f /var/log/auth.log # 实时输出最新日志若看到大量类似
Failed password for root from 1.2.3.4 port 56789 ssh2的记录,说明正在遭受暴力破解。 -
统计失败登录的 IP
# Ubuntu/Debian grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr # CentOS/RHEL grep "Failed password" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr输出结果中,数字越大的 IP 越可疑,可手动封禁(如
ufw deny from 1.2.3.4)。 -
设置日志告警
可通过脚本实现日志异常告警(如邮件、企业微信通知)。例如,以下脚本监控失败登录次数,超过5次则发送邮件:#!/bin/bash LOG_FILE="/var/log/auth.log" THRESHOLD=5 FAILED=$(grep "Failed password" $LOG_FILE | wc -l) if [ $FAILED -gt $THRESHOLD ]; then echo "SSH 失败登录次数超过阈值:$FAILED 次" | mail -s "SSH 安全告警" admin@example.com fi将脚本加入 crontab(如每5分钟执行一次):
*/5 * * * * /path/to/ssh_alert.sh
总结:构建多层次防御体系
SSH 暴力破解的防御不是单一措施能解决的,而是需要“端口隐藏+密钥认证+用户限制+Fail2ban+防火墙+日志监控”的多层次体系:
- 端口隐藏和防火墙规则过滤大部分无效攻击;
- 密钥认证从根源杜绝密码破解;
- 用户限制和 Fail2ban 进一步缩小攻击面;
- 日志监控则让异常行为无所遁形。
作为运维人员,需定期检查这些配置是否生效,及时更新系统和 SSH 版本(修复已知漏洞),并根据日志调整防御策略。只有将安全意识融入日常运维,才能真正保障服务器的 SSH 安全。










留言0