很多站长买回 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 不生效之类的问题,欢迎在评论区留言,看到都会回复。