
一、为什么VPS安全如此重要?
很多新手买完VPS第一件事就是赶紧搭网站、部署服务,安全配置则是"以后再说"——这恰恰是最危险的做法。根据安全厂商统计,一台公网VPS在上线后平均15分钟内就会开始遭受扫描和暴力破解攻击,每天被尝试登录的次数超过1000次。
不做安全加固的后果可能非常严重:
- 被植入挖矿木马:CPU占满100%,服务器变卡,你的电费/流量费暴增
- 被发垃圾邮件:IP被列入黑名单,你的正常邮件全部进垃圾箱
- 被当作跳板机:黑客用你的服务器攻击他人,法律风险找上你
- 数据被勒索加密:网站、数据库全部锁死,不交比特币就不恢复
- 被DDoS打瘫:业务完全中断,没有防护的小VPS几分钟就被打死
好消息是:VPS安全加固并不复杂。按照本文步骤操作1小时,就能防御99%以上的常见攻击。所有命令都经过实测,CentOS 7+/Debian 10+/Ubuntu 18+通用,可以直接复制使用。
二、VPS面临的5大安全威胁
在开始加固前,先了解你的VPS究竟面临哪些威胁,才能有针对性地防护:
从发生概率看,SSH暴力破解是最高频的威胁,几乎所有公网服务器每天都会遇到;从危害程度看,DDoS攻击和数据丢失是最致命的——前者让你的业务直接停摆,后者让你永远找不回数据。
理解了威胁来源,下面我们从最核心的SSH加固开始,一层一层建立完整的安全防线。
三、SSH安全加固8步法(核心必做)
SSH是你远程管理VPS的唯一通道,一旦被攻破,服务器就完全属于黑客了。SSH加固也是性价比最高的安全措施——完成这8步可以抵御99%的暴力破解攻击。
3.1 修改SSH默认端口(第1步)
SSH默认端口22是所有扫描器的首选目标。改成一个不常见的高端口(10000-65535之间),可以立刻减少90%以上的自动化扫描。
bash
# 编辑SSH配置文件
sudo vi /etc/ssh/sshd_config
# 找到 Port 22 这一行,改成你想要的端口(例如22345)
# 注意:不要用其他服务常用的端口(如3306/8080/8443等)
Port 22345
# 保存退出后重启SSH
# Debian/Ubuntu:
sudo systemctl restart sshd
# CentOS/RHEL:
sudo systemctl restart sshd
改完端口后,记得在防火墙中放行新端口(后面防火墙章节会讲),否则你下次就连不上了。连接时需指定端口:
bash
ssh -p 22345 username@your-server-ip
3.2 禁用root直接登录(第2步)
root是Linux的超级管理员,所有扫描器都会优先尝试root账号。禁用root直接登录,改用普通用户登录后再sudo提权,即使密码泄露也不会直接丢掉服务器控制权。
bash
# 1. 先创建一个普通用户(例如admin)
sudo adduser admin
sudo usermod -aG sudo admin # Debian/Ubuntu 加入sudo组
# 或 CentOS: sudo usermod -aG wheel admin
# 2. 测试新用户能正常登录并sudo
su - admin
sudo whoami # 应该返回 root
# 3. 确认没问题后,修改SSH配置禁用root登录
sudo vi /etc/ssh/sshd_config
PermitRootLogin no
# 4. 重启SSH
sudo systemctl restart sshd
3.3 使用SSH密钥登录,禁用密码登录(第3步,最关键)
这是单步效果最强的安全措施。RSA密钥的长度是2048位或4096位,暴力破解需要的计算量远超当前全人类算力总和——只要私钥不泄露,理论上不可能被破解。
bash - 在你的本地电脑执行
# 1. 在本地电脑生成密钥对(一路回车即可,建议设置passphrase给私钥加密)
ssh-keygen -t rsa -b 4096 -C "your-email@example.com"
# 2. 把公钥上传到服务器(替换成你的用户、IP、端口)
ssh-copy-id -p 22345 admin@your-server-ip
# 3. 测试密钥登录(应该不需要输入密码就能登录)
ssh -p 22345 admin@your-server-ip
确认密钥登录正常工作后,在服务器上禁用密码登录:
bash - 在服务器上执行
sudo vi /etc/ssh/sshd_config
# 设置以下参数
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
# 重启SSH
sudo systemctl restart sshd
3.4 安装Fail2ban自动封禁暴力IP(第4步)
即使已经禁用密码登录,Fail2ban依然值得安装——它可以监控日志文件,发现多次登录失败的IP就自动加入iptables黑名单封禁一段时间,减少无效流量和日志噪音。
bash
# Debian/Ubuntu
sudo apt install fail2ban -y
# CentOS
sudo yum install epel-release -y
sudo yum install fail2ban -y
# 创建本地配置(不要直接改jail.conf)
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo vi /etc/fail2ban/jail.local
# 修改 [DEFAULT] 段:
bantime = 86400 # 封禁24小时(单位秒)
findtime = 600 # 10分钟内
maxretry = 3 # 失败3次就封禁
# 启动并设置开机自启
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
# 查看已封禁的IP
sudo fail2ban-client status sshd
3.5-3.8 进阶加固
完成前4步已经能防住绝大多数攻击。以下4步是进阶加固,按需要选择:
限制登录IP白名单
在 /etc/ssh/sshd_config 中添加 AllowUsers admin@192.168.1.* ,只允许指定IP段登录。适合有固定办公IP的场景。
设置空闲超时自动断开
添加 ClientAliveInterval 300 和 ClientAliveCountMax 2,闲置5分钟自动断开SSH,防止忘记退出被他人利用。
登录告警通知
在 /etc/pam.d/sshd 末尾添加脚本,每次SSH登录成功时自动发邮件/钉钉/微信通知你,有人非法登录能第一时间发现。
配置MFA双因子认证
安装Google Authenticator PAM模块,登录时除了密钥还需要输入手机App上的动态验证码。适合安全等级要求极高的场景。
四、UFW防火墙配置实战
防火墙是第二道防线——原则是"默认拒绝,按需开放",只让真正需要的端口对外提供服务。推荐新手使用UFW(Uncomplicated Firewall),命令简单直观。
4.1 基础配置(必做)
bash
# 安装UFW(Debian/Ubuntu一般已预装)
sudo apt install ufw -y
# ⚠️ 重要:先放行SSH端口,否则启用后会把自己锁外面!
sudo ufw allow 22345/tcp # 改成你自己改的SSH端口
# 设置默认策略
sudo ufw default deny incoming # 默认拒绝所有入站
sudo ufw default allow outgoing # 默认允许所有出站
# 启用防火墙
sudo ufw enable
4.2 按需开放端口
根据你实际运行的服务开放对应端口,不要开放不需要的端口:
bash
# 建站必备
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
# FTP/Mail等其他服务(按需开放)
# sudo ufw allow 21/tcp # FTP
# sudo ufw allow 25/tcp # SMTP
# SSH防暴力破解:限制连接频率(比简单allow更安全)
sudo ufw limit 22345/tcp # 30秒内连接超过6次自动拒绝
# IP白名单:只允许你的办公IP访问SSH(最安全)
# sudo ufw allow from 你的办公IP to any port 22345
# 查看当前规则
sudo ufw status numbered
# 删除某条规则(用编号指定)
# sudo ufw delete 3
sudo systemctl stop firewalld && sudo systemctl disable firewalld,再安装UFW即可。或者直接使用 firewall-cmd 命令,原理相同。五、Fail2ban深度配置(防Web攻击)
前面只配置了SSH防护,Fail2ban还可以保护Nginx、WordPress等应用层服务。推荐补充以下jail配置:
bash
sudo vi /etc/fail2ban/jail.local
# 添加以下内容保护Nginx和WordPress
[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 3
bantime = 86400
[nginx-botsearch]
enabled = true
port = http,https
logpath = /var/log/nginx/access.log
maxretry = 2
bantime = 86400
[wordpress-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/access.log
filter = wordpress-auth
maxretry = 5
bantime = 86400
# 重启Fail2ban生效
sudo systemctl restart fail2ban
六、DDoS攻击与防御方案
DDoS(分布式拒绝服务攻击)是最让站长头疼的攻击方式——攻击者控制大量"肉鸡"向你的服务器发送海量请求,打满带宽或耗尽连接数,让正常用户无法访问。
6.1 DDoS防御的三层方案
| 防御层级 | 方案 | 防护能力 | 成本 | 适用场景 |
|---|---|---|---|---|
| 第一层 | 选择自带DDoS防护的机房 | 10-100Gbps | 免费 | 所有网站(必做) |
| 第二层 | 接入CDN(Cloudflare/阿里云CDN) | 隐藏源IP+缓存加速 | 免费-$20/月 | 面向公众的网站 |
| 第三层 | 购买高防IP/高防CDN | 100Gbps-Tbps级 | $100+/月 | 经常被攻击的业务 |
6.2 软件层面减轻DDoS影响
虽然软件层面防不了大流量DDoS,但适当的内核参数调整可以减轻小规模CC/SYN攻击的影响:
bash - SYN洪水防护
sudo vi /etc/sysctl.conf
# 添加以下参数
net.ipv4.tcp_syncookies = 1 # 启用SYN Cookies
net.ipv4.tcp_max_syn_backlog = 2048 # 增大SYN队列
net.ipv4.tcp_synack_retries = 2 # 减少SYN重试次数
net.ipv4.icmp_echo_ignore_broadcasts = 1 # 忽略广播ping
net.ipv4.conf.all.rp_filter = 1 # 反向路径过滤
# 生效
sudo sysctl -p
🛡️ LuckVM所有节点默认自带DDoS基础防护
美国/香港/日本机房均提供免费的DDoS基础清洗能力,可抵御常见的小规模攻击。对于高防护需求的用户,还提供高防IP附加服务,专业T级清洗集群秒级响应。新用户首单8折,使用优惠码 LUCKVM2026。
七、系统级安全加固
SSH和防火墙只是大门,系统本身的安全同样重要。以下是系统级加固清单:
7.1 保持系统和软件更新
bash
# Debian/Ubuntu:定期执行安全更新
sudo apt update && sudo apt upgrade -y
# CentOS/RHEL
sudo yum update -y
# 建议开启自动安全更新
sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure -plow unattended-upgrades
7.2 创建非特权用户运行服务
永远不要用root运行Web服务/数据库/应用。为每个服务创建独立的低权限用户,即使某个服务被攻破,攻击者也只能拿到有限权限:
bash
sudo useradd -r -s /sbin/nologin www-data
# 确保Nginx/MySQL/PHP-FPM等服务都以非root用户运行
7.3 关闭不必要的服务
运行的服务越少,攻击面越小。查看并关闭不用的服务:
bash
# 查看监听的端口
sudo ss -tulnp
# 关闭不需要的服务
sudo systemctl stop avahi-daemon
sudo systemctl disable avahi-daemon
7.4 安装入侵检测工具
bash
# 安装rootkit检测工具
sudo apt install rkhunter chkrootkit -y
sudo rkhunter --check
# 文件完整性检查(关键文件被篡改时报警)
sudo apt install aide -y
sudo aideinit
八、数据备份3-2-1黄金策略
安全防护再严密,也不可能100%杜绝事故。数据备份是最后的生命线——没有备份,勒索病毒、误删操作、硬盘损坏任何一个都可能让你的数据永久丢失。
8.1 网站备份自动化脚本
对于WordPress等建站场景,以下脚本可以自动备份网站文件和数据库,并保留7天历史版本:
bash - /root/backup.sh
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backup"
SITE_DIR="/var/www/html"
DB_NAME="your_database"
DB_USER="your_db_user"
DB_PASS="your_db_password"
mkdir -p $BACKUP_DIR
# 备份数据库
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME | gzip > $BACKUP_DIR/db_$DATE.sql.gz
# 备份网站文件
tar -czf $BACKUP_DIR/site_$DATE.tar.gz $SITE_DIR
# 删除7天前的备份
find $BACKUP_DIR -name "*.gz" -mtime +7 -delete
echo "Backup completed: $DATE"
添加到crontab每天凌晨3点自动执行:
bash
sudo crontab -e
# 添加以下行
0 3 * * * /bin/bash /root/backup.sh >> /var/log/backup.log 2>&1
8.2 异地备份到对象存储
本地备份不够——VPS硬盘损坏或被勒索病毒加密时本地备份也会丢失。推荐把备份同步到异地对象存储:
bash
# 安装rclone工具(支持S3/OSS/COS/OneDrive等几十种存储)
curl https://rclone.org/install.sh | sudo bash
# 配置对象存储(按交互式向导填写)
rclone config
# 同步备份到对象存储
rclone sync /backup remote:your-bucket/backup/
九、监控告警与应急响应
9.1 关键监控指标
建议安装监控工具实时监控以下指标,异常时及时告警:
| 监控项 | 告警阈值 | 可能原因 |
|---|---|---|
| CPU使用率 | 持续80%+超过10分钟 | 挖矿病毒/流量异常/爬虫 |
| 内存使用率 | 持续90%+ | 内存泄漏/被攻击/OOM |
| 带宽流量 | 突然超过日常3倍 | DDoS攻击/被爬取/被盗刷 |
| 磁盘空间 | 使用率超过85% | 日志爆增/被上传大文件 |
| SSH登录 | 非常用IP登录 | 账号可能已泄露 |
| 失败登录次数 | 单IP 1分钟超过10次 | 暴力破解攻击 |
推荐工具:Netdata(开箱即用的实时监控面板)、Uptime Kuma(轻量网站宕机监控)、Prometheus+Grafana(企业级方案)。
9.2 被入侵后的应急响应流程
万一不幸被入侵,按以下流程处理:
不要慌,先断网
立即在控制台关闭服务器公网网卡或切断网络,防止黑客继续操作或销毁证据。
保留证据
通过VNC/控制台登录,备份关键日志文件(/var/log/auth.log、/var/log/nginx/access.log、history记录),用于溯源分析。
备份数据
把网站文件和数据库备份到本地(注意不要备份木马文件,恢复前要先查杀)。
重装系统
被入侵过的系统不建议清理后继续使用——黑客可能留下多个后门,清理不干净。最安全的做法是直接重装系统。
按本文加固后恢复
重装后严格按照本文8步SSH加固+防火墙+Fail2ban全套配置做完,再恢复网站数据。同时更换所有密码和密钥。
十、常见问题FAQ
ignoreip = 127.0.0.1/8 ::1 你的办公IP。grep ^Port /etc/ssh/sshd_config 即可查看到SSH端口。修改端口前务必在保持一个终端连接的同时,新开一个终端测试新端口可以正常登录。🚀 安全从一台可靠的VPS开始
LuckVM美国/香港/日本VPS默认自带DDoS基础防护,支持控制台VNC救援、一键重装快照、安全组防火墙配置,配合本文的安全加固教程,为你的业务提供坚实保障。新用户首单享8折优惠。




