第一次买海外VPS时,最关心的是带宽、线路和延迟,却忽略了一个更现实的问题:服务器刚开机没多久,就已经被全球扫描器盯上了。
尤其是香港、日本、新加坡、美国等热门机房,22端口几乎每天都会收到大量暴力破解请求。很多用户甚至还没部署网站,日志里已经开始出现大量:
- root 登录尝试
- SSH密码爆破
- 异常IP扫描
- 字典攻击
- 恶意机器人探测
如果服务器长期裸奔,轻则CPU异常占用、日志爆炸,重则直接被撞库登录、植入后门、挖矿程序,甚至成为攻击跳板。
因此,SSH安全加固不是“可选项”,而是海外服务器上线后的第一件事。
这篇文章会完整讲清楚:
- 为什么SSH必须加固
- 如何修改SSH默认端口
- 如何彻底禁用密码登录
- 如何配置SSH密钥认证
- 如何部署Fail2Ban自动封禁攻击IP
- 如何避免把自己锁在服务器外面
- 如何验证安全策略是否真正生效
整套方案适用于:
- Ubuntu
- Debian
- CentOS
- Rocky Linux
- AlmaLinux
- Oracle Linux
无论你是搭建网站、WordPress、Docker、代理服务还是数据库环境,这套SSH安全方案都建议长期保留。
为什么海外服务器更容易被暴力破解
很多用户以为:
“我服务器没人知道IP,应该很安全。”
实际上公网IP每天都在被全球扫描。
黑客并不是“人工盯着你”,而是通过自动化脚本不断扫描:
- 22端口
- 3389端口
- Redis默认端口
- MySQL默认端口
- Docker API
- Elasticsearch
尤其SSH默认22端口,几乎是所有扫描器的首要目标。
你可以执行:
lastb
或者:
cat /var/log/auth.log
通常会看到大量类似日志:
Failed password for root from 185.xxx.xxx.xxx
Invalid user admin from 103.xxx.xxx.xxx
Failed password for ubuntu from 91.xxx.xxx.xxx
有些服务器一天会收到几千次尝试。
如果密码强度不够,或者使用简单口令:
root123
admin123
123456
password
那么被撞库只是时间问题。
SSH安全加固的核心思路
真正有效的SSH防护,并不是单独依赖某一个措施,而是组合策略。
推荐的方案:
| 安全措施 | 作用 |
|---|---|
| 修改SSH端口 | 减少扫描命中 |
| 禁用root密码登录 | 防止暴力破解 |
| 使用SSH密钥 | 替代弱密码 |
| 禁止空密码 | 避免低级漏洞 |
| 配置Fail2Ban | 自动封禁攻击IP |
| 防火墙限制端口 | 减少暴露面 |
| 定期更新系统 | 修复漏洞 |
很多人只改端口,但实际上这只能降低扫描量,不能真正防止攻击。
真正安全的是:
“密码彻底失效,只允许密钥登录。”
修改SSH默认22端口
默认SSH端口:
22
这是全球扫描器重点攻击对象。
虽然改端口不是绝对安全,但可以显著降低日志污染和无效攻击。
修改SSH配置文件
编辑:
/etc/ssh/sshd_config
Ubuntu/Debian:
sudo nano /etc/ssh/sshd_config
CentOS:
sudo vi /etc/ssh/sshd_config
找到:
#Port 22
修改为:
Port 46221
建议:
- 不要使用过于简单的端口
- 不要用8888、12345这种常见端口
- 选择10000以上端口
例如:
Port 46221
放行防火墙端口
很多人改完SSH端口后,直接失联。
原因是:
防火墙没放行新端口。
Ubuntu UFW
查看状态:
sudo ufw status
放行:
sudo ufw allow 46221/tcp
CentOS Firewalld
sudo firewall-cmd --permanent --add-port=46221/tcp
sudo firewall-cmd --reload
重启SSH服务
Ubuntu/Debian:
sudo systemctl restart ssh
CentOS:
sudo systemctl restart sshd
千万不要立刻关闭当前SSH窗口
正确做法:
新开一个终端测试。
例如:
ssh -p 46221 root@你的IP
确认能连接后,再关闭旧会话。
否则一旦配置错误,你可能只能进VNC救援模式。
配置SSH密钥登录
这是SSH安全最核心的一步。
相比密码:
SSH密钥几乎无法被暴力破解。
因为它不是简单字符口令,而是非对称加密认证。
Windows生成SSH密钥
Windows 11已经自带OpenSSH。
PowerShell执行:
ssh-keygen
连续回车即可。
生成位置:
C:\Users\用户名\.ssh\
会得到:
id_rsa
id_rsa.pub
其中:
| 文件 | 作用 |
|---|---|
| id_rsa | 私钥 |
| id_rsa.pub | 公钥 |
私钥必须自己保存。
绝对不要泄露。
上传公钥到服务器
方法一:
ssh-copy-id -p 46221 root@服务器IP
如果本地没有ssh-copy-id,也可以手动上传。
手动方式
服务器执行:
mkdir -p ~/.ssh
nano ~/.ssh/authorized_keys
把:
id_rsa.pub
内容复制进去。
然后设置权限:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
测试密钥登录
执行:
ssh -p 46221 root@服务器IP
如果直接登录成功,没有输入密码。
说明密钥认证已经生效。
禁用SSH密码登录
这是最关键的一步。
如果不关闭密码,即使配置了密钥,攻击者仍然可以暴力破解密码。
编辑:
/etc/ssh/sshd_config
修改以下内容:
PasswordAuthentication no
同时建议:
PermitRootLogin prohibit-password
PubkeyAuthentication yes
PermitEmptyPasswords no
推荐最终配置:
Port 46221
PermitRootLogin prohibit-password
PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no
UsePAM yes
配置含义解析
PermitRootLogin prohibit-password
含义:
允许root登录,但只能用密钥。
禁止root密码认证。
PasswordAuthentication no
彻底关闭密码登录。
这是防爆破核心。
PermitEmptyPasswords no
禁止空密码账户。
检查SSH配置是否有语法错误
很多人改完直接重启。
结果SSH启动失败。
正确做法:
sshd -t
如果没有输出。
说明配置正常。
重新启动SSH
systemctl restart sshd
Ubuntu部分系统:
systemctl restart ssh
Fail2Ban是什么
即使关闭密码登录。
攻击请求仍然会不断扫描服务器。
Fail2Ban的作用:
自动识别恶意IP。
并动态封禁。
它本质是:
“日志分析 + 防火墙联动”
例如:
某IP连续5次登录失败。
Fail2Ban自动:
iptables ban
或者:
firewalld ban
攻击IP会被临时拉黑。
安装Fail2Ban
Ubuntu/Debian:
sudo apt update
sudo apt install fail2ban -y
CentOS:
sudo yum install epel-release -y
sudo yum install fail2ban -y
启动Fail2Ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
查看状态:
systemctl status fail2ban
配置SSH防护规则
不要直接修改:
jail.conf
正确方式:
创建:
/etc/fail2ban/jail.local
写入:
[sshd]
enabled = true
port = 46221
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
findtime = 10m
bantime = 12h
参数详解
| 参数 | 作用 |
|---|---|
| enabled | 启用规则 |
| port | SSH端口 |
| filter | 使用ssh过滤器 |
| logpath | 日志路径 |
| maxretry | 最大失败次数 |
| findtime | 检测时间 |
| bantime | 封禁时间 |
CentOS日志路径不同
CentOS通常是:
/var/log/secure
因此:
logpath = /var/log/secure
重启Fail2Ban
systemctl restart fail2ban
查看封禁状态
查看整体状态:
fail2ban-client status
查看SSH状态:
fail2ban-client status sshd
会看到:
Banned IP list:
手动解封IP
如果误封:
fail2ban-client set sshd unbanip IP地址
例如:
fail2ban-client set sshd unbanip 1.1.1.1
配合防火墙效果更好
推荐:
- Ubuntu:UFW
- CentOS:Firewalld
只开放必要端口:
22/SSH
80/HTTP
443/HTTPS
其它全部关闭。
不要暴露:
- Redis
- MySQL
- MongoDB
- Docker Remote API
这些端口一旦裸露公网,非常危险。
SSH安全加固后的效果
配置完成后。
你会发现:
- auth.log安静很多
- 暴力破解大量减少
- CPU异常占用下降
- 无意义扫描减少
- 服务器更稳定
尤其是海外VPS。
差别非常明显。
额外推荐的SSH安全策略
禁止root直接登录
更严格的做法:
创建普通用户:
adduser admin
加入sudo:
usermod -aG sudo admin
然后:
PermitRootLogin no
以后:
ssh admin@IP
再:
sudo su
这是企业服务器常见方案。
限制SSH登录IP
如果你有固定办公IP。
可以直接限制:
allow 你的IP
deny all
或者:
iptables白名单。
这是更高级的安全策略。
使用Google Authenticator双重验证
可以增加:
- 动态验证码
- 手机二次验证
即使密钥泄露。
也难以登录。
适合:
- 重要业务服务器
- 企业生产环境
- 金融类项目
定期更新系统补丁
很多入侵并不是密码问题。
而是漏洞。
建议定期执行:
Ubuntu:
apt update && apt upgrade -y
CentOS:
yum update -y
最容易犯的几个错误
改端口后没放行防火墙
最常见。
直接失联。
禁用密码前没测试密钥
结果:
永远登录不上。
authorized_keys权限错误
SSH直接拒绝密钥。
正确权限:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
导致根本不生效。
Ubuntu:
/var/log/auth.log
CentOS:
/var/log/secure
一套适合长期使用的SSH安全方案
个人比较推荐的长期组合:
| 项目 | 推荐 |
|---|---|
| SSH端口 | 10000以上 |
| 登录方式 | 仅密钥 |
| root登录 | 禁止密码 |
| Fail2Ban | 必装 |
| 防火墙 | 只开放必要端口 |
| 双重验证 | 重要服务器启用 |
这套方案已经足够应对绝大多数自动化攻击。
对于个人站长、中小企业、跨境业务服务器来说,安全性会比默认配置高很多。
很多服务器被入侵,并不是因为黑客技术有多强,而是因为默认配置太“裸”。
默认22端口。
默认root登录。
默认密码认证。
这些组合在海外公网环境里,风险极高。
真正成熟的运维习惯,不是等服务器被挂马后再补救,而是在上线第一天就完成SSH安全加固。

全球服务器测评

