VPS安全加固完整指南:从SSH配置到防火墙规则(2026)

📝 641 字 · ☕ 2 分钟阅读

前言:为什么你的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 -isu - 切换到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服务也锁死。

推荐阅读:

📤 分享这篇文章