本文目录导读:

- 最核心、最有效的防御:禁用密码登录,使用密钥认证
- 强密码与用户管理(如果必须使用密码)
- 更换默认端口
- 使用Fail2Ban(最推荐的辅助工具)
- 使用防火墙限制来源IP(IP白名单)
- 启用SSH日志记录与审计
- 其他高级或防御性措施
- 快速落地实战步骤
SSH爆破攻击(即暴力破解攻击)是指攻击者通过自动化工具,尝试大量用户名和密码组合来登录你的服务器,防御这种攻击的核心思路是:减少攻击面、增加破解难度、及时阻断与告警。
以下是针对不同程度和需求的防御方案,按推荐优先级排序:
最核心、最有效的防御:禁用密码登录,使用密钥认证
这是彻底根除SSH暴力破解的根本方法,密码可以被猜测,但私钥(通常2048位或4096位)在数学上几乎无法暴力破解。
- 操作步骤:
- 生成密钥对(如果还没有): 在你的本地客户端(电脑)上运行
ssh-keygen -t rsa -b 4096。 - 将公钥复制到服务器:
ssh-copy-id username@your_server_ip(或手动将公钥内容追加到服务器的~/.ssh/authorized_keys文件中)。 - 修改服务器SSH配置: 编辑
/etc/ssh/sshd_config文件:PasswordAuthentication no(禁用密码登录)PubkeyAuthentication yes(启用密钥认证)ChallengeResponseAuthentication no(禁用挑战响应认证,通常也建议关闭)
- 重启SSH服务:
sudo systemctl restart sshd(或sudo service ssh restart视系统而定)。
- 生成密钥对(如果还没有): 在你的本地客户端(电脑)上运行
注意: 在修改配置前,务必保持一个已登录的SSH会话未关闭,以防配置错误导致自己无法登录,测试新会话正常后再关闭旧会话。
强密码与用户管理(如果必须使用密码)
如果由于特殊原因(如自动脚本、特定第三方工具)无法完全禁用密码,必须设置高复杂度密码并限制用户。
- 强密码策略: 要求密码长度至少16位,包含大小写字母、数字和特殊字符,可以使用
pwgen工具生成随机密码。 - 禁止root直接登录: 编辑
/etc/ssh/sshd_config,设置PermitRootLogin no,使用普通用户登录后通过su -或sudo提权,这极大增加了攻击者猜测“小概率”用户名的难度。 - 限制特定用户: 设置
AllowUsers your_username,只允许指定的用户通过SSH登录。
更换默认端口
虽然这不是安全防御,但能“静默”地避开大量自动化扫描脚本(它们默认只扫22端口)。
- 操作: 在
/etc/ssh/sshd_config中修改Port 2222(或其他大于1024的非标准端口)。 - 注意: 这不会阻止针对你新端口的定向攻击,但能减少99%的无差别扫描噪音,你需要更新防火墙规则和本地SSH客户端配置(
ssh -p 2222 user@host)。
使用Fail2Ban(最推荐的辅助工具)
Fail2Ban 是一个实时日志监控工具,它监控 /var/log/auth.log(或其他系统日志),发现来自同一个IP的多次失败登录尝试后,会自动修改本地防火墙(如iptables/nftables)规则,临时或永久封禁该IP。
- 安装:
sudo apt install fail2ban(Debian/Ubuntu)或sudo yum install fail2ban(CentOS/RHEL)。 - 配置: 复制默认配置
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local,编辑jail.local文件,关键是找到[sshd]部分,设置:maxretry = 3(尝试3次失败后封禁)bantime = 3600(封禁3600秒,即1小时,-1为永久封禁)findtime = 600(在10分钟内累计达到maxretry次)
- 效果: 自动、动态地阻断暴力攻击来源IP。
使用防火墙限制来源IP(IP白名单)
如果你的服务器只从特定IP(如公司办公网络、家庭固定公网IP)访问,这是最理想的状态:只允许这些IP连接SSH。
- iptables/nftables(Linux):
sudo ufw allow from 192.168.1.100 to any port 22(UFW示例) 或sudo iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT。 - 云服务商安全组: 在阿里云、腾讯云、AWS等控制台中,找到服务器的安全组规则,修改SSH(22端口)的 来源IP 为
你的_公网IP/32(8.8.8/32),这是最推荐的做法,因为防火墙在数据传输到服务器之前就被过滤掉了。
启用SSH日志记录与审计
即使有防御,也建议开启详细日志以便追溯。
- 操作: 在
/etc/ssh/sshd_config中设置LogLevel VERBOSE。 - 监控: 使用
journalctl -u sshd或tail -f /var/log/auth.log实时查看登录尝试,结合 fail2ban 使用效果更佳。
其他高级或防御性措施
- 端口敲门(Port Knocking): 按顺序访问一组关闭的端口,服务器检测到后才会短暂地开放SSH端口,非常有效,但配置稍复杂。
- SSH-2 协议限制: 确保只使用 SSH 协议第二版(
Protocol 2),禁用不安全的旧版协议。 - 空闲超时自动断开: 设置
ClientAliveInterval 300和ClientAliveCountMax 0,让闲置5分钟以上的连接自动断开。 - 使用SSH堡垒机/跳板机: 所有SSH连接先到一台配置了严格策略的中间服务器,再跳转到目标主机。
快速落地实战步骤
如果你是普通站长,想快速有效防御:
- 第一优先级: 禁用密码登录,只使用密钥 + 修改默认端口(22改到比如 12345)。
- 第二优先级: 启用 Fail2Ban。
- 第三优先级(可选但强烈建议): 在云服务商后台,将SSH端口的白名单设为你的固定公网IP(如果不是固定IP,可配合DDNS或使用VPN服务器)。
最终提醒: 修改SSH配置或防火墙规则时,始终保留一个已连接的SSH会话作为安全通道,避免意外锁死自己,配置完成后,务必重启SSH服务(sudo systemctl restart sshd)。