服务器SSH防止暴力破解详细配置和完整踩坑记录

测试环境说明

服务器:LuckVM 美西GIA节点 系统:Debian 12 OpenSSH版本:OpenSSH_9.2p1 Debian-2+deb12u3

新服务器上线第一件事绝对是做SSH安全加固,我上周刚给美西节点装完系统,忘了改SSH端口,第二天看日志发现一晚上有2万多次暴力破解尝试,都是从俄罗斯、巴西、印度的IP扫过来的,试各种常见密码。很多新手觉得密码设复杂点就行,其实暴力破解脚本都是跑字典的,哪怕密码再复杂,天天被扫也有概率撞上,而且大量破解请求还会占服务器资源,导致正常SSH连接卡。

这篇把我踩过的所有坑都记下来,从改端口到配置fail2ban,再到禁root登录,一步步写清楚,照着做基本就能挡住99.9%的暴力破解。


一、修改SSH默认端口(最有效,挡掉90%的批量扫描)

默认的22端口是所有扫描器第一个扫的,改个非常规端口,扫描器根本不会扫到,瞬间清净。

  1. 先备份配置文件,改错了还能恢复:

cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

  1. 编辑配置文件,找到Port 22那一行,改成你自己的端口,比如22345(注意端口要在1-65535之间,别用常用端口比如80/443/3306):

nano /etc/ssh/sshd_config
# 找到 #Port 22,改成:
Port 22345
# 注意:别把#去掉之后直接改,一定要把Port那行的注释#删掉才生效

  1. ⚠️ 最关键的坑!先别重启SSH!先在防火墙放行新端口,不然你会把自己关在服务器外面,只能去VNC控制台救!

# ufw防火墙放行新端口
ufw allow 22345/tcp
ufw reload
# 如果用的firewalld
# firewall-cmd --permanent --add-port=22345/tcp
# firewall-cmd --reload

  1. 测试新端口能正常连接之后,再重启SSH服务:

systemctl restart sshd
# 验证端口在监听
ss -tulnp | grep sshd

  1. 开一个新的SSH窗口,用新端口连接服务器,确认能连上之后,再关掉原来的窗口,千万不要一开始就关掉原来的连接,不然连不上就麻烦了。

二、禁止root用户直接登录

默认root用户权限最高,所有暴力破解都是先试root用户名,禁掉之后直接挡掉一大半。

  1. 先新建一个普通用户,设置好密码,加上sudo权限:

adduser ops # 新建ops用户,密码设复杂点
usermod -aG sudo ops # 给sudo权限

  1. 测试普通用户能正常登录、能正常sudo之后,再修改SSH配置禁止root登录:

nano /etc/ssh/sshd_config
# 找到 PermitRootLogin yes,改成:
PermitRootLogin no

  1. 重启SSH服务:

systemctl restart sshd

⚠️ 坑:一定要先新建普通用户测试好,再禁root,不然你就再也登不上root了,只能进VNC改回来。


三、配置SSH密钥登录,彻底禁用密码登录

这是最安全的方式,没有私钥谁也登不上,哪怕密码泄露了也没用。

  1. 本地电脑生成密钥对(Windows在PowerShell里跑,Mac/Linux直接在终端跑):

ssh-keygen -t ed25519
# 一路回车就行,会在~/.ssh/目录下生成id_ed25519(私钥,自己存好别泄露)和id_ed25519.pub(公钥,传到服务器上)

  1. 把公钥传到服务器上:

ssh-copy-id -p 22345 ops@你的服务器IP

  1. 测试密钥登录能不能正常用,确认不用输密码就能登上之后,再禁用密码登录:

nano /etc/ssh/sshd_config
# 找到 PasswordAuthentication yes,改成:
PasswordAuthentication no
# 顺便把空密码登录禁了
PermitEmptyPasswords no

  1. 重启SSH服务:

systemctl restart sshd

⚠️ 超级大坑:一定要测试密钥登录完全正常,再禁用密码!我之前有一次传公钥的时候权限错了,密钥登不上,又把密码禁了,直接锁死服务器,只能重装系统。


四、安装fail2ban,自动封暴力破解IP

就算改了端口,还是有可能被针对性扫描,fail2ban会监控SSH登录日志,同一个IP试错密码超过次数就自动封IP一段时间,非常省心。

  1. 安装fail2ban:

apt update && apt install -y fail2ban
systemctl enable --now fail2ban

  1. 配置SSH防护规则:

nano /etc/fail2ban/jail.local

写入下面的配置:

[sshd]
enabled = true
port = 22345 # 你自己的SSH端口
filter = sshd
logpath = /var/log/auth.log
maxretry = 3 # 试错3次就封
bantime = 86400 # 封24小时,单位秒
findtime = 3600 # 1小时内试错算累计

  1. 重启fail2ban生效:

systemctl restart fail2ban
# 查看状态
fail2ban-client status sshd

配置完之后,你可以故意输错3次密码测试,会发现直接IP被封,连不上了,等24小时或者去服务器上手动解封就行。


五、我踩过的坑总结

  1. 改SSH端口前一定要先放行防火墙,不然必把自己关外面,别问我怎么知道的
  2. 所有配置修改完,一定要开新窗口测试没问题,再关旧窗口,这是运维铁则
  3. 密钥登录一定要测试正常再禁用密码,权限不对的话公钥不生效,直接锁死
  4. 别用2222、22222这种常见的SSH替代端口,扫描器也会扫这些端口,选个随机的五位数端口就行
  5. fail2ban的日志在/var/log/fail2ban.log,可以看到哪些IP被封了,我这边平均每天能封100多个恶意IP,服务器日志清净多了
posted @ 2026-11-02 23:30  前端已挂  阅读(3)  评论(0)    收藏  举报