2066 字
10 分钟
VPS 服务器安全加固完全指南 2026:SSH 防护 + 防火墙 + Fail2ban + 入侵检测
买完 VPS 的当天,全球无数自动化扫描机器人就会开始尝试暴力破解你的 SSH。如果使用默认配置(root 用户 + 密码登录 + 22 端口),你的服务器有可能在几小时内就被攻破。
本文按优先级顺序覆盖 VPS 安全加固的完整步骤,适合个人开发者和小团队运维场景。
快速检查清单
在进行详细配置前,先用这个清单评估你的服务器当前状态:
# 查看当前 SSH 暴力破解尝试次数(最近24小时)grep "Failed password" /var/log/auth.log | wc -l
# 查看当前正在登录的用户w
# 查看最近的登录记录last -n 20
# 查看当前开放的端口ss -tulpn
# 检查是否有未知 cron 任务crontab -lls /etc/cron.d/一、创建非 root 用户
# 创建新用户adduser deploy # 按提示设置密码usermod -aG sudo deploy # 加入 sudo 组
# 切换到新用户测试 sudosu - deploysudo whoami # 应该输出 root二、SSH 密钥认证(最重要的单一安全措施)
2.1 本地生成密钥对
# 在你的本地机器(Mac/Linux)上执行ssh-keygen -t ed25519 -C "your-email@example.com" -f ~/.ssh/vps_key# ed25519 是目前推荐的算法,比 RSA 更安全更短
# 查看公钥(需要复制到服务器)cat ~/.ssh/vps_key.pub2.2 将公钥部署到服务器
# 方法一:ssh-copy-id(推荐)ssh-copy-id -i ~/.ssh/vps_key.pub deploy@your-server-ip
# 方法二:手动复制(如果 ssh-copy-id 不可用)# 在服务器上执行:mkdir -p ~/.sshchmod 700 ~/.sshecho "粘贴你的公钥内容" >> ~/.ssh/authorized_keyschmod 600 ~/.ssh/authorized_keys2.3 本地 SSH 配置
# ~/.ssh/config(本地机器)Host myserver HostName your-server-ip User deploy Port 2222 # 修改后的端口(见下文) IdentityFile ~/.ssh/vps_key ServerAliveInterval 60 ServerAliveCountMax 3
# 以后直接 ssh myserver 即可2.4 加固 SSH 服务配置
# ⚠️ 修改前确保已能用密钥登录!
Port 2222 # 非标准端口(减少扫描机器人攻击)AddressFamily inet # 仅 IPv4(可选)
# 禁用 root 直接登录PermitRootLogin no
# 禁用密码登录(只允许密钥)PasswordAuthentication noChallengeResponseAuthentication noKbdInteractiveAuthentication no
# 只允许指定用户 SSHAllowUsers deploy
# 安全加强选项MaxAuthTries 3 # 最多3次尝试MaxSessions 5LoginGraceTime 30 # 30秒内完成认证ClientAliveInterval 300 # 5分钟无操作断开ClientAliveCountMax 2
# 禁用不必要的功能X11Forwarding noAllowAgentForwarding noAllowTcpForwarding no # 如果不需要 SSH 隧道PermitTunnel noPermitEmptyPasswords no
# 密码学强化KexAlgorithms curve25519-sha256,diffie-hellman-group14-sha256Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.comMACs hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com# 检查配置语法后重启sshd -t && systemctl restart ssh
# ⚠️ 测试:新开一个终端窗口连接,确保能登录后再关闭当前会话ssh -p 2222 deploy@your-server-ip三、UFW 防火墙
# 安装 UFW(Ubuntu/Debian 通常预装)apt install ufw -y
# 默认策略:拒绝入站,允许出站ufw default deny incomingufw default allow outgoing
# 开放必要端口(按需添加)ufw allow 2222/tcp comment "SSH non-standard port"ufw allow 80/tcp comment "HTTP"ufw allow 443/tcp comment "HTTPS"
# 开放特定 IP 的访问(例如只允许办公室 IP 访问数据库)ufw allow from 203.0.113.5 to any port 5432 comment "PostgreSQL from office"
# 限制连接速率(防止暴力破解,一定程度上替代 Fail2ban)ufw limit 2222/tcp comment "Rate limit SSH"
# 启用防火墙ufw enableufw status verbose# 常用 UFW 命令ufw status numbered # 显示规则编号ufw delete 3 # 删除第3条规则ufw delete allow 80/tcp # 按规则删除ufw reload # 重新加载规则ufw disable # 禁用(保留规则)ufw reset # 完全重置(清空所有规则)四、Fail2ban(自动封禁暴力破解 IP)
apt install fail2ban -y
# 创建本地配置文件(不要直接编辑 jail.conf)cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local# /etc/fail2ban/jail.local(关键配置项)[DEFAULT]# 封禁时间:1小时(生产环境推荐更长)bantime = 3600# 检测时间窗口:10分钟findtime = 600# 允许失败次数maxretry = 5# 封禁动作:更新 iptables 并发邮件通知(可选)action = %(action_mw)s
# 使用 systemd journal(现代 Ubuntu 推荐)backend = systemd
[sshd]enabled = trueport = 2222 # 改为你实际的 SSH 端口logpath = %(sshd_log)smaxretry = 3 # SSH 更严格:3次失败即封禁bantime = 86400 # SSH 封禁24小时
[nginx-http-auth]enabled = true
[nginx-limit-req]enabled = true# 启动 Fail2bansystemctl enable fail2bansystemctl start fail2ban
# 常用管理命令fail2ban-client status # 查看所有 jail 状态fail2ban-client status sshd # 查看 SSH jail 详情fail2ban-client set sshd banip 1.2.3.4 # 手动封禁 IPfail2ban-client set sshd unbanip 1.2.3.4 # 手动解封 IPfail2ban-client banned # 列出所有被封 IP五、自动安全更新
apt install unattended-upgrades -ydpkg-reconfigure --priority=low unattended-upgrades
# 配置文件cat > /etc/apt/apt.conf.d/50unattended-upgrades << 'EOF'Unattended-Upgrade::Allowed-Origins { "${distro_id}:${distro_codename}-security"; "${distro_id}ESMApps:${distro_codename}-apps-security"; "${distro_id}ESM:${distro_codename}-infra-security";};// 自动重启(如果内核更新需要)Unattended-Upgrade::Automatic-Reboot "true";Unattended-Upgrade::Automatic-Reboot-Time "03:00";// 邮件通知(可选)Unattended-Upgrade::Mail "admin@example.com";Unattended-Upgrade::MailReport "on-change";EOF
# 启用自动更新cat > /etc/apt/apt.conf.d/20auto-upgrades << 'EOF'APT::Periodic::Update-Package-Lists "1";APT::Periodic::Download-Upgradeable-Packages "1";APT::Periodic::AutocleanInterval "7";APT::Periodic::Unattended-Upgrade "1";EOF
# 测试(dry-run)unattended-upgrades --dry-run --debug六、CrowdSec(社区协防,推荐替代 Fail2ban)
# 安装 CrowdSeccurl -s https://install.crowdsec.net | sudo bashapt install crowdsec -y
# 安装防火墙 bouncer(执行实际封禁动作)apt install crowdsec-firewall-bouncer-iptables -y
# 查看当前状态cscli hub list # 已安装的解析器和场景cscli decisions list # 当前封禁决策cscli alerts list # 告警列表cscli metrics # 统计信息
# 手动添加封禁cscli decisions add --ip 1.2.3.4 --duration 24h --reason "manual block"
# 查看 CrowdSec 从社区接收的黑名单 IP 数量cscli hub list -t scenario七、系统审计与入侵检测
7.1 auditd(操作审计)
apt install auditd -ysystemctl enable auditd
# /etc/audit/rules.d/audit.rules(关键审计规则)cat >> /etc/audit/rules.d/audit.rules << 'EOF'# 监控 /etc/passwd 和 /etc/shadow 修改-w /etc/passwd -p wa -k user-modify-w /etc/shadow -p wa -k user-modify-w /etc/sudoers -p wa -k sudo-modify
# 监控 SSH 配置修改-w /etc/ssh/sshd_config -p wa -k ssh-config
# 监控 cron 任务-w /etc/cron.d/ -p wa -k cron-modify-w /var/spool/cron/ -p wa -k cron-modify
# 监控特权命令执行-a always,exit -F arch=b64 -S execve -F euid=0 -k root-commandsEOF
auditctl -R /etc/audit/rules.d/audit.rulessystemctl restart auditd
# 查询审计日志ausearch -k user-modify -ts today # 今天对 passwd 的修改ausearch -k root-commands -ts today # 今天 root 执行的命令aureport --summary # 总体统计报告7.2 rkhunter(Rootkit 检测)
apt install rkhunter -y
# 首次建立基线(安装后立即运行,记录当前干净状态)rkhunter --updaterkhunter --propupd # 记录文件属性基线
# 日常扫描rkhunter --check --skip-keypress
# 设置每日自动扫描(/etc/cron.daily/rkhunter)cat > /etc/cron.daily/rkhunter << 'EOF'#!/bin/bash/usr/bin/rkhunter --cronjob --update --quietEOFchmod +x /etc/cron.daily/rkhunter八、系统内核参数加固
cat > /etc/sysctl.d/99-security.conf << 'EOF'# 禁止 IP 转发(不作为路由器时)net.ipv4.ip_forward = 0net.ipv6.conf.all.forwarding = 0
# 防止 SYN 洪水攻击net.ipv4.tcp_syncookies = 1net.ipv4.tcp_syn_retries = 2net.ipv4.tcp_synack_retries = 2
# 忽略 ICMP ping(可选,防止被扫描发现)# net.ipv4.icmp_echo_ignore_all = 1
# 防止 IP 欺骗net.ipv4.conf.all.rp_filter = 1net.ipv4.conf.default.rp_filter = 1
# 禁用源路由net.ipv4.conf.all.accept_source_route = 0net.ipv4.conf.default.accept_source_route = 0
# 防止 ICMP 重定向net.ipv4.conf.all.accept_redirects = 0net.ipv4.conf.default.accept_redirects = 0net.ipv4.conf.all.send_redirects = 0
# 记录可疑数据包net.ipv4.conf.all.log_martians = 1net.ipv4.conf.default.log_martians = 1
# 内核地址不对外暴露kernel.dmesg_restrict = 1kernel.kptr_restrict = 2EOF
sysctl -p /etc/sysctl.d/99-security.conf九、入侵排查速查
# ── 检查当前状态 ────────────────────────────────────────────────who && w # 当前登录用户last -n 30 # 最近30次登录记录lastb -n 20 # 最近20次登录失败记录ss -tnp # 当前已建立的 TCP 连接ss -tulpn # 所有监听端口
# ── 检查异常进程和文件 ────────────────────────────────────────────ps aux --sort=-%cpu | head -20 # CPU 占用最高的进程ps aux --sort=-%mem | head -20 # 内存占用最高的进程ls -la /proc/*/exe 2>/dev/null | grep deleted # 被删除的可执行文件(常见木马特征)
# ── 检查可疑文件 ──────────────────────────────────────────────────find /tmp /var/tmp /dev/shm -type f -perm /111 2>/dev/null # 可执行文件find / -mtime -1 -type f -name "*.sh" 2>/dev/null | head # 最近1天新建的 .shfind / -perm -4000 -type f 2>/dev/null # SUID 文件
# ── 检查定时任务 ──────────────────────────────────────────────────for user in $(cut -d: -f1 /etc/passwd); do crontab -u $user -l 2>/dev/null && echo "--- $user ---"done
# ── 检查启动项 ────────────────────────────────────────────────────systemctl list-units --type=service --state=runningls /etc/systemd/system/ # 自定义 service 文件相关文章:
- Linux 服务器监控完全指南 2026:Prometheus + Grafana + Alertmanager
- Nginx 进阶完全指南 2026:反向代理 + HTTPS + 负载均衡
- Docker 完全指南 2026:Compose 多服务编排与生产部署
- Cloudflare Workers 完全指南 2026:边缘计算 + R2 + Pages
- GitHub Actions CI/CD 完全指南 2026
本文基于 Ubuntu 24.04 LTS 编写,Debian 系其他发行版命令基本相同。CentOS/RHEL 系请将
apt替换为dnf,防火墙工具替换为firewalld。安全配置不是一劳永逸的,建议每月检查一次系统日志和安全更新状态。
VPS 服务器安全加固完全指南 2026:SSH 防护 + 防火墙 + Fail2ban + 入侵检测
https://971918.xyz/posts/docs/vps-security-hardening-guide/