VPS(Virtual Private Server)是众多开发者、站长和企业部署服务的首选。然而,购买VPS后,如果仅保持默认配置就上线,无异于将服务器大门敞开。根据Shodan和Censys的扫描数据,互联网上平均每分钟有超过2000次针对22端口的扫描尝试。本文将手把手教你从零开始,搭建一套企业级的VPS安全防护体系,覆盖防火墙、SSH加固、入侵检测、日志审计、内核参数优化等核心环节。

一、SSH远程连接安全加固
SSH是VPS管理的生命线,也是最常被暴力破解的攻击面。以下措施能极大提升SSH的安全性。
1.1 修改默认端口与禁用root登录
将SSH默认的22端口改为高位端口(如2222、10022),可以过滤掉绝大多数自动化扫描攻击。同时禁用root直接登录,使用普通用户+sudo方式管理。
# 编辑SSH配置文件
sudo vim /etc/ssh/sshd_config
# 修改以下配置项
Port 2222
PermitRootLogin no
PasswordAuthentication yes # 如使用密钥认证可设为no
PubkeyAuthentication yes
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2
# 重启SSH服务
sudo systemctl restart sshd
# 注意:修改端口后需同步放行防火墙,否则会被锁在门外!
1.2 配置SSH密钥认证
密钥认证比密码认证安全得多,2048位以上的RSA/Ed25519密钥几乎无法被暴力破解。
# 在本地机器生成密钥对(不要设置密码短语可免密登录,但建议设置)
ssh-keygen -t ed25519 -a 100 -f ~/.ssh/vps_key
# 将公钥上传到VPS
ssh-copy-id -i ~/.ssh/vps_key.pub -p 2222 user@your-vps-ip
# 测试密钥登录
ssh -i ~/.ssh/vps_key -p 2222 user@your-vps-ip
# 确认密钥登录正常后,关闭密码登录
# 在 /etc/ssh/sshd_config 中设置:
PasswordAuthentication no
ChallengeResponseAuthentication no
1.3 安装Fail2ban阻止暴力破解
Fail2ban通过分析日志文件,发现多次认证失败后自动将来源IP加入防火墙黑名单,能有效阻止暴力破解和字典攻击。
# 安装Fail2ban
dnf install -y epel-release # CentOS/RHEL
sudo apt install fail2ban -y # Debian/Ubuntu
# 配置Fail2ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo vim /etc/fail2ban/jail.local
# 添加SSH规则(如果修改了端口要同步更改)
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = 3600
findtime = 600
# 启动并设置开机自启
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
# 查看封禁状态
sudo fail2ban-client status sshd
实战说明:bantime=3600表示封禁1小时,maxretry=5表示5次失败即触发封禁。对于生产环境,建议初始设置为24小时(86400秒),后续可根据实际威胁情况调整。

二、iptables/nftables防火墙策略
防火墙是服务器的第一道防线。现代Linux系统推荐使用nftables,但iptables仍被广泛支持。我们以nftables为例配置精细化访问控制策略。
2.1 安装与基础配置
# 检查nftables是否已安装
sudo nft list ruleset
# 如未安装
sudo apt install nftables -y
# 编写防火墙规则脚本
sudo vim /etc/nftables.conf
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
# 允许已建立和相关的连接
ct state established,related accept
# 允许环回接口
iif lo accept
# 允许ICMP(ping)
ip protocol icmp accept
ip6 protocol icmpv6 accept
# SSH(修改为你的端口)
tcp dport 2222 accept
# HTTP/HTTPS(Web服务器)
tcp dport {80, 443} accept
# DNS
udp dport 53 accept
# 限制SSH连接频率(每分钟最多5个新连接)
tcp dport 2222 meter ssh-meter { ip saddr limit rate 5/minute } accept
# 记录并丢弃其他所有入站流量
log prefix "NFTABLES-DROP: " limit rate 3/minute
reject
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
# 应用规则
sudo nft -f /etc/nftables.conf
# 启用开机自启
sudo systemctl enable nftables
2.2 防止DDoS攻击的基本规则
在nftables中添加连接跟踪和速率限制,可以减轻DDoS攻击的影响:
# 添加SYN洪水防护
tcp flags syn tcp option maxseg size 1-536 drop
# 限制同一IP的并发连接数
tcp dport 80 meter http-meter { ip saddr ct count over 100 } reject
# 限制每个IP的新建连接速率
tcp dport 80 meter http-rate { ip saddr limit rate 30/second burst 50 } accept
| 攻击类型 | 防护策略 | 效果 |
|---|---|---|
| SYN Flood | synproxy + 速率限制 | 有效防御95%以上 |
| UDP Flood | 按端口限制速率 | 降低80%影响 |
| HTTP Flood | 连接数限制 + WAF | 需多层配合 |
| 端口扫描 | 端口敲门 + 隐藏端口 | 完全屏蔽扫描 |
三、系统级安全加固
3.1 内核参数优化
通过调整sysctl参数可以增强网络栈的安全性:
# 编辑 /etc/sysctl.conf 或 /etc/sysctl.d/99-security.conf
# 禁用IP转发(如果不需要路由功能)
net.ipv4.ip_forward = 0
net.ipv6.conf.all.forwarding = 0
# 防止SYN洪水攻击
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_synack_retries = 2
# 减少TIME_WAIT连接数
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
# 忽略ICMP重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
# 忽略源路由
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
# 开启反向路径过滤(防IP欺骗)
net.ipv4.conf.all.rp_filter = 1
# 记录马丁攻击
net.ipv4.conf.all.log_martians = 1
# 应用配置
sudo sysctl -p /etc/sysctl.conf
3.2 文件和目录权限管理
严格限制敏感文件的访问权限是安全基线的一部分:
# SSH相关
sudo chmod 700 ~/.ssh
sudo chmod 600 ~/.ssh/authorized_keys
sudo chmod 644 ~/.ssh/known_hosts
# 系统关键文件
sudo chmod 640 /etc/shadow
sudo chmod 644 /etc/passwd
sudo chmod 600 /etc/ssh/sshd_config
# 日志文件权限
sudo chmod 640 /var/log/auth.log
sudo chmod 640 /var/log/syslog
# 使用AIDE做文件完整性检查(可选)
sudo apt install aide -y
sudo aideinit
sudo mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db
# 每日检查
sudo crontab -e
# 添加:0 6 * * * /usr/bin/aide --check | mail -s "AIDE Report" admin@example.com

四、入侵检测与日志审计
4.1 安装Lynis安全审计工具
Lynis是开源的安全审计工具,可以扫描系统中的安全漏洞并给出修复建议:
# 安装Lynis
wget https://downloads.cisofy.com/lynis/lynis-3.1.1.tar.gz
tar xzf lynis-3.1.1.tar.gz
cd lynis
# 执行审计(不需要root也能运行,但root权限能检测更多项目)
sudo ./lynis audit system
# 查看结果汇总
sudo ./lynis audit system --quick
# Lynis会输出 Hardening Index 分数,目标是70分以上
4.2 安装osquery实现实时监控
osquery将操作系统视为数据库,可以用SQL查询系统状态,非常适合做安全监控:
# 安装osquery
curl -L https://osquery.io/downloads/official/5.12.0/osquery-5.12.0_1.linux_x86_64.tar.gz | tar xz
sudo mv osquery-5.12.0 /usr/local/osquery
# 配置自动监控
sudo vim /etc/osquery/osquery.conf
{
"options": {
"pidfile": "/var/osquery/osquery.pid",
"database_path": "/var/osquery/osquery.db"
},
"schedule": {
"process_events": {
"query": "SELECT pid, name, path, cmdline FROM processes;",
"interval": 300
},
"listening_ports": {
"query": "SELECT pid, port, address, protocol FROM listening_ports;",
"interval": 600
},
"suspicious_cron": {
"query": "SELECT * FROM crontab WHERE command LIKE '%wget%' OR command LIKE '%curl%' OR command LIKE '%chmod +x%';",
"interval": 3600
}
},
"file_paths": {
"ssh_keys": ["/root/.ssh/authorized_keys", "/home/%/.ssh/authorized_keys"],
"web_config": ["/etc/nginx/nginx.conf", "/etc/apache2/apache2.conf"]
}
}
4.3 日志集中管理
分散的日志难以审计,建议使用rsyslog将日志发送到集中日志服务器,或使用logwatch生成每日摘要:
# 安装logwatch生成每日安全报告
sudo apt install logwatch -y
# 配置每天凌晨发送报告
sudo vim /etc/cron.daily/00logwatch
#!/bin/bash
/usr/sbin/logwatch --output mail --mailto admin@example.com --detail high --service All --range today
# 手动测试
sudo logwatch --detail high --service All --range today
五、自动化安全运维脚本
将以上安全措施整合为一个自动部署脚本,方便批量部署到多台VPS:
#!/bin/bash
# VPS安全一键加固脚本
# 用法:bash vps_harden.sh [SSH_PORT]
SSH_PORT=${1:-2222}
# 1. 更新系统
apt update && apt upgrade -y
# 2. 创建普通用户
if ! id deploy &>/dev/null; then
useradd -m -s /bin/bash deploy
echo "deploy ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
mkdir -p /home/deploy/.ssh
chmod 700 /home/deploy/.ssh
fi
# 3. SSH安全加固
sed -i "s/^#Port 22/Port $SSH_PORT/" /etc/ssh/sshd_config
sed -i "s/^PermitRootLogin yes/PermitRootLogin no/" /etc/ssh/sshd_config
sed -i "s/^#PasswordAuthentication yes/PasswordAuthentication no/" /etc/ssh/sshd_config
systemctl restart sshd
# 4. 安装Fail2ban
apt install fail2ban -y
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sed -i "s/^port = ssh/port = $SSH_PORT/" /etc/fail2ban/jail.local
systemctl enable fail2ban && systemctl start fail2ban
# 5. 配置nftables
apt install nftables -y
nft -f /etc/nftables.conf
systemctl enable nftables
# 6. 内核安全参数
echo "net.ipv4.tcp_syncookies = 1" >> /etc/sysctl.conf
sysctl -p
# 7. 自动安全更新
apt install unattended-upgrades -y
dpkg-reconfigure --priority=low unattended-upgrades
echo "✅ VPS安全加固完成!"
echo "⚠️ 请将本地公钥添加到 /home/deploy/.ssh/authorized_keys"
echo "⚠️ 使用 ssh deploy@IP -p $SSH_PORT 登录"
六、持续安全运维要点
- 定期更新:设置unattended-upgrades自动安装安全补丁,每周手动检查一次完整更新
- 端口管理:只开放必要的端口,定期用nmap扫描检查暴露面
- 备份策略:采用3-2-1备份原则(3份副本,2种介质,1份异地),使用rclone同步到对象存储
- 监控报警:配置Prometheus + Grafana或Netdata监控系统指标,超出阈值时通过Telegram/邮件报警
- 定期渗透:每季度使用Lynis和OpenVAS进行安全扫描,修补发现的风险
- 最小权限:应用服务使用独立用户运行,不给予不必要的权限
- WAF防护:如搭建Web服务,建议前置Nginx + ModSecurity或Cloudflare WAF
总结
VPS安全不是一次性配置就能一劳永逸的,而是一个持续演进的过程。本文从SSH加固、防火墙策略、系统内核优化、入侵检测、日志审计到自动化部署,覆盖了VPS安全的主要环节。按照本文步骤操作后,你的VPS将具备抵御绝大多数自动化攻击的能力,安全等级可以达到中等偏上的水平。
在实际运维中,请记住:安全配置越严格,使用越不便,需要在安全性和便利性之间找到平衡点。建议先在测试机上验证所有配置,确认无误后再应用到生产环境。如果首次配置时被锁在门外,可以通过VPS厂商的VNC/控制台面板进入恢复模式修复配置。
最后,推荐大家关注CVE漏洞公告(https://cve.mitre.org)和所在发行版的安全公告。网络安全是一场持久的攻防战,保持学习和警惕是最好的防御策略。
汤不热吧