前言:为什么你的VPS需要安全加固?
如果你刚买了一台VPS,装好系统就连上SSH开始跑服务——那你的服务器大概率已经成为别人眼中的「肉鸡」了。
VPS被攻破最常见的入口,不是应用漏洞,不是0day,而是最简单的弱密码和默认端口。一台暴露在公网的Ubuntu 24.04,启用SSH后的几分钟内就会被扫描到,然后就是暴力破解。
本神人今天不搞虚的,直接给你一套生产级VPS安全加固方案。从SSH配置、防火墙到自动更新——全部实操命令,步步验证。跟着走完,你的服务器安全性直接提升一个数量级。
一、SSH安全配置:让暴力破解无计可施
SSH是VPS管理的命门。99%的攻击都是从SSH入手的。我们先加固这一层。
1.1 备份并编辑SSH配置文件
$ sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
$ sudo nano /etc/ssh/sshd_config
1.2 修改默认端口(22 → 自定义端口)
默认的22端口被全网扫描器重点关照。换一个高位端口能过滤掉90%的自动攻击。
# 找到 #Port 22 这一行,修改为:
Port 22022 # 建议选择 1024-65535 范围内的端口
修改后别忘了在云服务商控制台的安全组/防火墙规则中放行新端口,否则你会把自己锁在外面。
1.3 禁止 root 直接登录
# 找到 PermitRootLogin,修改为:
PermitRootLogin no
这意味着你必须先以普通用户身份SSH登录,再用 sudo -i 或 su - 切换到root。多一层障碍,攻击者就多一分成本。
1.4 禁用密码登录,强制使用密钥认证
# 找到以下行,确保修改为:
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
在禁用密码登录之前,你必须在本地生成并上传SSH密钥:
# 在本地机器上生成密钥对(如果还没有)
$ ssh-keygen -t ed25519 -C "your-email@example.com"
# 将公钥复制到VPS
$ ssh-copy-id -i ~/.ssh/id_ed25519.pub user@your-vps-ip
# 验证密钥登录正常后,再修改 sshd_config 禁用密码
1.5 限制允许登录的用户
# 在 sshd_config 末尾添加:
AllowUsers yourusername
这确保只有指定的用户能通过SSH登录,其他账户一律拒绝。
1.6 其他SSH安全参数
# 登录超时(防止空闲会话被利用)
ClientAliveInterval 300
ClientAliveCountMax 2
# 限制最大连接数
MaxAuthTries 3
MaxSessions 5
# 禁用X11转发和TCP转发(如果不需要)
X11Forwarding no
AllowTcpForwarding no
# 禁用空密码
PermitEmptyPasswords no
1.7 重启SSH服务并验证
$ sudo systemctl restart sshd
# 保持当前SSH会话不断开,新开一个终端测试新端口
$ ssh -p 22022 yourusername@your-vps-ip
# 能连上即表示配置正确
$ sudo systemctl status sshd
● ssh.service - OpenSSH Daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled)
Active: active (running) since Fri 2026-06-05 09:00:00 CST
Main PID: 12345 (sshd)
Tasks: 1 (limit: 1024)
Memory: 1.2M
CPU: 200ms
二、UFW防火墙配置:守住每一条通道
UFW(Uncomplicated Firewall)是Ubuntu自带的前端,底层是iptables。对小白友好,对老手够用。
2.1 安装并启用UFW
$ sudo apt update && sudo apt install ufw -y
# 默认策略:拒绝所有入站,允许所有出站
$ sudo ufw default deny incoming
$ sudo ufw default allow outgoing
2.2 放行必要端口
# SSH(根据你改的端口)
$ sudo ufw allow 22022/tcp
# HTTP / HTTPS(如果你跑Web服务)
$ sudo ufw allow 80/tcp
$ sudo ufw allow 443/tcp
# 如果跑MySQL等数据库——千万不要开放3306到公网!
# 仅在需要远程管理时限制来源IP:
$ sudo ufw allow from 203.0.113.0/24 to any port 3306 proto tcp
2.3 启用并查看状态
$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
$ sudo ufw status numbered
Status: active
To Action From
-- ------ ----
[ 1] 22022/tcp ALLOW IN Anywhere
[ 2] 80/tcp ALLOW IN Anywhere
[ 3] 443/tcp ALLOW IN Anywhere
[ 4] 22022/tcp (v6) ALLOW IN Anywhere (v6)
[ 5] 80/tcp (v6) ALLOW IN Anywhere (v6)
[ 6] 443/tcp (v6) ALLOW IN Anywhere (v6)
2.4 善用UFW管理命令
# 删除一条规则(用status numbered看到的编号)
$ sudo ufw delete 2
# 临时禁用防火墙(调试用)
$ sudo ufw disable
# 查看完整规则(iptables格式)
$ sudo ufw show raw
# 限制SSH连接频率(防暴力破解)
$ sudo ufw limit 22022/tcp
关键原则:先放行你的SSH端口,再enable。顺序错了你会把自己锁在门外。
三、Fail2Ban:自动封禁恶意IP
UFW管的是端口开不开,Fail2Ban管的是「谁在作恶」。它监控日志,发现异常行为就自动封IP。
3.1 安装并配置
$ sudo apt install fail2ban -y
# 创建本地配置文件(不要直接改 jail.conf)
$ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
$ sudo nano /etc/fail2ban/jail.local
3.2 核心配置参数
[DEFAULT]
# 被封禁时长(秒):3600 = 1小时,86400 = 24小时
bantime = 3600
# 在 findtime 秒内最多尝试 maxretry 次
findtime = 600
maxretry = 5
# 忽略的IP(你自己的固定IP)
ignoreip = 127.0.0.1/8 ::1 203.0.113.5
[sshd]
enabled = true
port = 22022 # 匹配你改过的SSH端口
logpath = /var/log/auth.log # Ubuntu/Debian
# logpath = /var/log/secure # CentOS/RHEL
3.3 启动并验证
$ sudo systemctl enable fail2ban
$ sudo systemctl start fail2ban
# 查看SSH jail状态
$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:
放一晚上,第二天再查,大概率已经有IP被ban了。公网的恶意扫描比你想象的多得多。
四、系统自动更新:不费脑子的安全底线
不更新系统的VPS = 开源漏洞展示馆。但手动更新又容易忘。用unattended-upgrades搞定。
$ sudo apt install unattended-upgrades -y
# 启用自动安全更新
$ sudo dpkg-reconfigure --priority=low unattended-upgrades
# 弹出的对话框选 Yes
# 或者命令行启用
$ sudo sed -i 's|//\t"${distro_id}:${distro_codename}-security";|\t"${distro_id}:${distro_codename}-security";|' \
/etc/apt/apt.conf.d/50unattended-upgrades
# 验证配置
$ sudo unattended-upgrades --dry-run --debug
# 确认输出末尾没有错误
# 查看最近的自动更新日志
$ cat /var/log/unattended-upgrades/unattended-upgrades.log | tail -20
2026-06-04 06:45:20,889 INFO Initial blacklisted packages:
2026-06-04 06:45:20,890 INFO Starting unattended upgrades script
2026-06-04 06:45:20,890 INFO Allowed origins are: o=Ubuntu,a=noble-security
2026-06-04 06:45:28,150 INFO Packages that will be upgraded: libssl3t64 openssl
2026-06-04 06:45:28,151 INFO Writing dpkg log to /var/log/unattended-upgrades
2026-06-04 06:45:48,597 INFO All upgrades installed
五、禁用不必要的服务
每个运行的服务都是一个潜在的攻击面。停掉你用不上的。
# 查看所有正在监听端口的服务
$ sudo ss -tlnp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22022 0.0.0.0:* users:(("sshd",pid=12345,fd=3))
LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=23456,fd=6))
LISTEN 0 128 0.0.0.0:443 0.0.0.0:* users:(("nginx",pid=23456,fd=7))
# 只开启了SSH和Nginx,状态健康 ✓
# 如果发现不必要的服务在监听(比如旧版smbd、rpcbind),禁用它们:
$ sudo systemctl disable --now smbd
$ sudo systemctl disable --now rpcbind
额外检查:
# 查看所有开机自启的服务,揪出可疑项
$ systemctl list-unit-files --type=service | grep enabled
六、快速安全检查清单
做完以上配置后,用这个清单逐项核对:
# 1. SSH非默认端口运行中
$ sudo ss -tlnp | grep sshd
LISTEN 0 128 0.0.0.0:22022 0.0.0.0:* users:(("sshd",pid=12345))
# 2. 密码登录已禁用
$ sudo grep '^PasswordAuthentication' /etc/ssh/sshd_config
PasswordAuthentication no
# 3. root登录已禁用
$ sudo grep '^PermitRootLogin' /etc/ssh/sshd_config
PermitRootLogin no
# 4. UFW已激活
$ sudo ufw status | head -1
Status: active
# 5. Fail2Ban运行中
$ sudo systemctl is-active fail2ban
active
# 6. 自动安全更新已启用
$ systemctl is-enabled unattended-upgrades
enabled
常见问题(FAQ)
Q: 改完SSH端口后把自己锁在外面了怎么办?
通过云服务商的VNC控制台(Web终端)登录。几乎所有VPS提供商(阿里云、腾讯云、AWS Lightsail、Vultr、DigitalOcean)都提供浏览器内的控制台访问。登录后直接修改 /etc/ssh/sshd_config 恢复配置,然后 systemctl restart sshd 即可。这也是为什么改SSH配置时建议保持一个活跃会话不断开。
Q: UFW和Fail2Ban有什么区别?需要都装吗?
UFW是静态防火墙,负责「放行哪些端口和IP」。Fail2Ban是动态入侵防御系统,通过监控日志「发现暴力破解行为并临时封禁IP」。两者互补:UFW防止未经授权的端口访问,Fail2Ban阻止已授权的端口上的恶意行为。建议都装,不冲突。
Q: 密钥登录配置好后,还能用密码登录吗?
取决于你的 sshd_config 中 PasswordAuthentication 的设置。如果设为 no,则完全禁止密码登录,只能用密钥。强烈建议在确认密钥登录正常后立即禁用密码——这是VPS安全加固中最有效的一步。即使你在不同设备间登录,也应该复制密钥文件而不是退回到密码。
总结
VPS安全加固不是一劳永逸的事,但上面这套配置已经能挡住95%以上的自动化攻击。核心思路就四个字:最小暴露——
- 能不开放的端口不开放(UFW)
- 能用密钥的不用密码(SSH Key)
- 能自动封禁的不靠人工(Fail2Ban)
- 能自动更新的不等想起来(unattended-upgrades)
做完这套流程,你可以安心把VPS跑在这片互联网的「狂野西部」上了。本神人亲测,自从配了这套方案,auth.log里再也看不到成片的「Failed password」刷屏了。
下一篇预告:Nginx反向代理 + Let’s Encrypt自动续期实战。把Web服务也锁死。
推荐阅读: