服务器SSH防止暴力破解详细配置和完整踩坑记录
测试环境说明
服务器:LuckVM 美西GIA节点 系统:Debian 12 OpenSSH版本:OpenSSH_9.2p1 Debian-2+deb12u3
新服务器上线第一件事绝对是做SSH安全加固,我上周刚给美西节点装完系统,忘了改SSH端口,第二天看日志发现一晚上有2万多次暴力破解尝试,都是从俄罗斯、巴西、印度的IP扫过来的,试各种常见密码。很多新手觉得密码设复杂点就行,其实暴力破解脚本都是跑字典的,哪怕密码再复杂,天天被扫也有概率撞上,而且大量破解请求还会占服务器资源,导致正常SSH连接卡。
这篇把我踩过的所有坑都记下来,从改端口到配置fail2ban,再到禁root登录,一步步写清楚,照着做基本就能挡住99.9%的暴力破解。
一、修改SSH默认端口(最有效,挡掉90%的批量扫描)
默认的22端口是所有扫描器第一个扫的,改个非常规端口,扫描器根本不会扫到,瞬间清净。
- 先备份配置文件,改错了还能恢复:
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
- 编辑配置文件,找到Port 22那一行,改成你自己的端口,比如22345(注意端口要在1-65535之间,别用常用端口比如80/443/3306):
nano /etc/ssh/sshd_config
# 找到 #Port 22,改成:
Port 22345
# 注意:别把#去掉之后直接改,一定要把Port那行的注释#删掉才生效
- ⚠️ 最关键的坑!先别重启SSH!先在防火墙放行新端口,不然你会把自己关在服务器外面,只能去VNC控制台救!
# ufw防火墙放行新端口
ufw allow 22345/tcp
ufw reload
# 如果用的firewalld
# firewall-cmd --permanent --add-port=22345/tcp
# firewall-cmd --reload
- 测试新端口能正常连接之后,再重启SSH服务:
systemctl restart sshd
# 验证端口在监听
ss -tulnp | grep sshd
- 开一个新的SSH窗口,用新端口连接服务器,确认能连上之后,再关掉原来的窗口,千万不要一开始就关掉原来的连接,不然连不上就麻烦了。
二、禁止root用户直接登录
默认root用户权限最高,所有暴力破解都是先试root用户名,禁掉之后直接挡掉一大半。
- 先新建一个普通用户,设置好密码,加上sudo权限:
adduser ops # 新建ops用户,密码设复杂点
usermod -aG sudo ops # 给sudo权限
- 测试普通用户能正常登录、能正常sudo之后,再修改SSH配置禁止root登录:
nano /etc/ssh/sshd_config
# 找到 PermitRootLogin yes,改成:
PermitRootLogin no
- 重启SSH服务:
systemctl restart sshd
⚠️ 坑:一定要先新建普通用户测试好,再禁root,不然你就再也登不上root了,只能进VNC改回来。
三、配置SSH密钥登录,彻底禁用密码登录
这是最安全的方式,没有私钥谁也登不上,哪怕密码泄露了也没用。
- 本地电脑生成密钥对(Windows在PowerShell里跑,Mac/Linux直接在终端跑):
ssh-keygen -t ed25519
# 一路回车就行,会在~/.ssh/目录下生成id_ed25519(私钥,自己存好别泄露)和id_ed25519.pub(公钥,传到服务器上)
- 把公钥传到服务器上:
ssh-copy-id -p 22345 ops@你的服务器IP
- 测试密钥登录能不能正常用,确认不用输密码就能登上之后,再禁用密码登录:
nano /etc/ssh/sshd_config
# 找到 PasswordAuthentication yes,改成:
PasswordAuthentication no
# 顺便把空密码登录禁了
PermitEmptyPasswords no
- 重启SSH服务:
systemctl restart sshd
⚠️ 超级大坑:一定要测试密钥登录完全正常,再禁用密码!我之前有一次传公钥的时候权限错了,密钥登不上,又把密码禁了,直接锁死服务器,只能重装系统。
四、安装fail2ban,自动封暴力破解IP
就算改了端口,还是有可能被针对性扫描,fail2ban会监控SSH登录日志,同一个IP试错密码超过次数就自动封IP一段时间,非常省心。
- 安装fail2ban:
apt update && apt install -y fail2ban
systemctl enable --now fail2ban
- 配置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小时内试错算累计
- 重启fail2ban生效:
systemctl restart fail2ban
# 查看状态
fail2ban-client status sshd
配置完之后,你可以故意输错3次密码测试,会发现直接IP被封,连不上了,等24小时或者去服务器上手动解封就行。
五、我踩过的坑总结
- 改SSH端口前一定要先放行防火墙,不然必把自己关外面,别问我怎么知道的
- 所有配置修改完,一定要开新窗口测试没问题,再关旧窗口,这是运维铁则
- 密钥登录一定要测试正常再禁用密码,权限不对的话公钥不生效,直接锁死
- 别用2222、22222这种常见的SSH替代端口,扫描器也会扫这些端口,选个随机的五位数端口就行
- fail2ban的日志在
/var/log/fail2ban.log,可以看到哪些IP被封了,我这边平均每天能封100多个恶意IP,服务器日志清净多了

浙公网安备 33010602011771号