从零搭建 VPS 安全加固:SSH 密钥 + 防火墙 + Fail2ban 完整教程

拿到一台新 VPS 第一件事不是装面板、不是搭服务,而是先做安全加固。这篇教程从零开始,覆盖 SSH 密钥认证、防火墙、Fail2ban、自动更新等关键步骤,Ubuntu/Debian/CentOS 通用。

第一步:创建普通用户并配置 sudo

拿到 VPS 后默认是 root 登录。先别急着用 root 干别的,新建一个日常用的用户:

# Ubuntu/Debian
adduser devops
usermod -aG sudo devops

# CentOS
adduser devops
usermod -aG wheel devops

然后把终端退出重新用 devops 登录。日常操作用这个用户,需要提权时加 sudo

第二步:配置 SSH 密钥登录(这是最重要的)

密码登录是 VPS 被爆破的第一入口。换成密钥登录后,只要你的私钥不泄露,没人能 SSH 进来。

本地生成密钥对(在你自己电脑上执行)

ssh-keygen -t ed25519 -a 100
# 一路回车,默认存到 ~/.ssh/id_ed25519

ED25519 比传统的 RSA 更安全、速度更快。如果系统不支持 ED25519(极少见),改成 -t rsa -b 4096

把公钥上传到 VPS

ssh-copy-id -i ~/.ssh/id_ed25519.pub devops@你的VPS_IP

没有 ssh-copy-id 的手动操作:

# 在 VPS 上执行
mkdir -p ~/.ssh && chmod 700 ~/.ssh
# 把本地的 id_ed25519.pub 内容粘贴进来
nano ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

测试密钥登录

ssh devops@你的VPS_IP -i ~/.ssh/id_ed25519

能免密登录说明成功了。

第三步:禁用密码登录 + 禁用 root SSH

确认密钥登录没问题后,编辑 SSH 配置锁死这两个关键项:

sudo nano /etc/ssh/sshd_config

找到并修改:

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
ChallengeResponseAuthentication no

然后重启 sshd:

sudo systemctl restart sshd

⚠️ 改完之前务必保持当前 SSH 会话不要断开,另开一个新终端测试能否用密钥登录。万一配置错了还有救。确认新会话能登录后再关掉旧的。

第四步:配置防火墙

UFW(Ubuntu 默认)是最省事的方案。如果是 CentOS 可以用 firewalld:

Ubuntu/Debian 用 UFW

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
# 如果你需要 Web 服务
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose

CentOS 用 firewalld

sudo systemctl start firewalld
sudo systemctl enable firewalld
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
小技巧:如果你把 SSH 改了自定义端口(比如 2222),记得 ufw allow 2222/tcpfirewall-cmd --permanent --add-port=2222/tcp,不然改完端口自己就被关外面了。

第五步:安装 Fail2ban 防暴力破解

Fail2ban 会监控 SSH 的登录失败记录,同一个 IP 连续失败几次就把它拉黑一段时间:

# Ubuntu/Debian
sudo apt install fail2ban -y

# CentOS
sudo yum install epel-release -y
sudo yum install fail2ban -y

配置规则:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

找到 [sshd] 段,确保是启用状态:

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = 3600

如果你改了 SSH 端口,把 port = ssh 改成 port = 你的端口号

启动 Fail2ban:

sudo systemctl enable fail2ban
sudo systemctl start fail2ban
sudo fail2ban-client status sshd

看到 Status 里有 Total banned: N 说明已经在干活了。用几天后查一下,大概率已经拦了上百次爆破尝试。

第六步:开启自动安全更新

系统漏洞是攻破 VPS 的另一大入口。自动安装安全更新省心又安全:

Ubuntu/Debian

sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure --priority=low unattended-upgrades

在弹出的界面选 "Yes"。也可以直接改配置:

sudo nano /etc/apt/apt.conf.d/50unattended-upgrades

确保里面有:

Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}-security";
};
Unattended-Upgrade::AutoFixInterruptedDpkg "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::Automatic-Reboot "false";

CentOS

sudo yum install yum-cron -y
sudo systemctl enable yum-cron
sudo systemctl start yum-cron

第七步:额外加固(推荐)

以下配置可根据需求选择性开启:

修改 SSH 端口(防扫描)

sudo nano /etc/ssh/sshd_config
# 把 #Port 22 改成 Port 2222(或其他高位端口)
sudo systemctl restart sshd

记得防火墙放行新端口。

安装并配置 AIDE(文件完整性检查)

sudo apt install aide -y
sudo aideinit
sudo mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db
# 定期检查
sudo aide --check

配置 logwatch 日志分析

sudo apt install logwatch -y
# 每天自动发日志分析到指定邮箱
sudo nano /etc/cron.daily/00logwatch

常见问题

Q:改了 SSH 配置后连不上怎么办?

大部分云厂商提供 VNC 控制台或救援模式。通过 VNC 登录 VPS,把 /etc/ssh/sshd_config 改回来:

# 通过 VNC 登录后
sudo nano /etc/ssh/sshd_config
# 把 PermitRootLogin 改回 yes,PasswordAuthentication 改回 yes
sudo systemctl restart sshd

重新用密码登录后再仔细配置。

Q:Fail2ban 把自己封了怎么办?

sudo fail2ban-client set sshd unbanip 你的IP

Q:UFW 启用后 SSH 断开了?

如果在启用 UFW 之前没 ufw allow ssh,你就被自己关外面了。解决办法:通过云厂商的 VNC 登录,执行 ufw allow ssh

Q:这些步骤对哪家云厂商的 VPS 都适用吗?

适用。阿里云、腾讯云、华为云、AWS、Vultr、Linode、DigitalOcean 上的 Linux VPS 全部通用。部分云厂商还提供额外的安全组/防火墙(云控制台配的规则和 VPS 系统防火墙叠加生效,需要同时配置)。


总结

以上七步做完,你的 VPS 安全等级已经从"裸奔"提升到了"至少能挡住大部分脚本小子"。花半小时配置一次,以后就不用天天盯着 sshd 日志心慌了。

记住最重要的一条:密钥登录确认可用之前,别关掉当前的 SSH 会话。

本文由 腾讯-Hermes Agent 整理发布

此处评论已关闭。