VPS 安全加固实战:SSH 密钥登录、防火墙与 Fail2Ban 防爆破一次讲清


很多站长买回 VPS 之后,第一反应是装宝塔、传源码、绑域名,网站能打开就算完事。可公网上的服务器从开机那一刻起就在被扫描:SSH 端口每天都有成百上千次爆破尝试,弱口令、默认端口、暴露在公网的数据库,任何一个疏忽都可能让整台机器变成别人的肉鸡。

这篇文章按真实操作顺序,把 VPS 安全加固最关键的几件事一次讲清:系统更新、普通用户、SSH 密钥登录、防火墙、Fail2Ban 防爆破,以及被锁在门外时怎么救回来。下面的命令都经过实测,照着做即可,适合刚接触 VPS 的站长。

一、先搞清楚:VPS 到底面临哪些风险

公网上的攻击基本都是自动化的,常见入口集中在下面几类:

一是 SSH 弱口令和默认 22 端口,几乎每天都有扫描器在尝试登录;

二是 MySQL 的 3306、Redis 的 6379 直接对公网开放且没有密码,这是勒索和挖矿的重灾区;

三是面板与后台入口,phpMyAdmin、宝塔默认地址会被批量探测;

四是系统和 Web 程序长期不更新,内核、插件、主题的漏洞被现成工具利用;

五是源码与备份泄露,.git 目录、备份压缩包、phpinfo 页面被人直接下载。

加固的目标不是做到绝对安全,而是把攻击面和攻击成本降到最低:每少一个暴露端口,就少一分被拿下的概率。

二、第一步:更新系统并创建普通用户

拿到服务器先别急着装环境,先把系统补丁和账号基础打好。

# Debian / Ubuntu
apt update && apt upgrade -y
# CentOS / Rocky
yum update -y

# 创建普通用户并设置密码
adduser deploy
# 赋予 sudo 权限
usermod -aG sudo deploy      # Debian / Ubuntu
usermod -aG wheel deploy     # CentOS / Rocky

日常运维用普通用户加 sudo,root 只用于应急。这样即使某个服务被攻破,攻击者拿到的也不是最高权限。

三、SSH 密钥登录:把密码登录彻底关掉

密码登录是 SSH 最薄弱的环节,改成密钥登录后,爆破脚本即使扫到端口也无从下手。先在本地电脑生成密钥(Windows 用 PowerShell 或 Git Bash,macOS 和 Linux 用终端):

ssh-keygen -t ed25519 -C 'you@example.com'
ssh-copy-id -i ~/.ssh/id_ed25519.pub deploy@服务器IP

然后编辑服务器上的 /etc/ssh/sshd_config,把下面几项改成这样:

Port 22                  # 可改成 2222 等非标准端口
PermitRootLogin no       # 禁止 root 直接登录
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
ClientAliveInterval 300

保存后先检查语法,再重载服务:

sshd -t
systemctl reload sshd    # 部分系统服务名是 ssh

关键提醒:改端口或关闭密码登录之前,一定另开一个终端窗口,用密钥登录测试成功后再退出当前会话,否则很容易把自己锁在门外。

四、防火墙:只放行真正需要的端口

系统默认放行所有端口,加固时要反过来:先全部拒绝,再按需放行。Ubuntu、Debian 用 UFW:

ufw allow 22/tcp         # 改过端口就写实际端口
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
ufw status verbose

CentOS、Rocky 用 firewalld:

firewall-cmd --permanent --add-port=22/tcp
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --reload
firewall-cmd --list-all

注意两点:云服务器除了系统防火墙,还要在控制台安全组里放行同样的端口,两者缺一不可;MySQL 的 3306、Redis 的 6379 这类端口不要对公网开放,确需远程访问就走 SSH 隧道。

五、Fail2Ban:自动封禁暴力破解 IP

防火墙控制的是端口,Fail2Ban 盯着的是日志:同一个 IP 反复登录失败,就自动封禁。先安装,再复制一份本地配置:

apt install fail2ban -y
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

编辑 /etc/fail2ban/jail.local,在 [sshd] 段落里写入:

[sshd]
enabled = true
port = 22
maxretry = 3
findtime = 600
bantime = 86400

启动并查看状态:

systemctl enable --now fail2ban
fail2ban-client status sshd

参数含义很直观:10 分钟内失败 3 次,就封禁 24 小时。查看当前被封的 IP 用 fail2ban-client status sshd,需要手动解封用 fail2ban-client set sshd unbanip IP。

六、顺手做完的几项加固

下面几项不费什么时间,但收益很高:

1. 关掉不必要的服务和端口,用 ss -tulnp 看清到底有哪些程序在监听;

2. 让数据库只监听本机,MySQL 写 bind-address = 127.0.0.1,Redis 设置 bind 127.0.0.1 并开启密码;

3. 面板和 phpMyAdmin 改成不常见路径,能加二次验证就加,不用时直接关闭;

4. 开启自动安全更新,Ubuntu 装 unattended-upgrades 即可;

5. 定期看日志,lastb 查失败登录,journalctl -u ssh 看 SSH 记录,/var/log/auth.log 查认证事件;

6. 网站程序、插件、主题及时升级,别用来路不明的破解版源码。

七、被锁在门外怎么办(提前留好退路)

加固过程中最容易出的意外,就是改完 SSH 配置重启后发现连不上了。提前记住这几条:

优先用云厂商控制台里的 VNC、救援模式或 Web 终端,它们不依赖 SSH;

如果装了宝塔等面板,面板里的 SSH 管理和防火墙放行也能救急;

改配置前先备份,执行 cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak;

真进不去时,从 VNC 登录,把 PasswordAuthentication 改回 yes 或恢复备份,再执行 systemctl restart sshd 即可恢复。

八、结语

安全加固不是一次性任务,而是一套长期习惯:少开一个端口,就少一分风险;多留一条退路,就少一次通宵。把上面这几步走完,你的 VPS 基本已经挡住了公网上绝大多数自动化爆破,剩下的就是定期更新、偶尔看看日志,让服务器安静地跑下去。

如果你在配置过程中遇到 sshd 起不来、Fail2Ban 不生效之类的问题,欢迎在评论区留言,看到都会回复。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

-

VPS 定时任务实战:从 Crontab 到自动化运维一次讲清

评 论