2066 字
10 分钟

VPS 服务器安全加固完全指南 2026:SSH 防护 + 防火墙 + Fail2ban + 入侵检测

买完 VPS 的当天,全球无数自动化扫描机器人就会开始尝试暴力破解你的 SSH。如果使用默认配置(root 用户 + 密码登录 + 22 端口),你的服务器有可能在几小时内就被攻破。

本文按优先级顺序覆盖 VPS 安全加固的完整步骤,适合个人开发者和小团队运维场景。


快速检查清单#

在进行详细配置前,先用这个清单评估你的服务器当前状态:

Terminal window
# 查看当前 SSH 暴力破解尝试次数(最近24小时)
grep "Failed password" /var/log/auth.log | wc -l
# 查看当前正在登录的用户
w
# 查看最近的登录记录
last -n 20
# 查看当前开放的端口
ss -tulpn
# 检查是否有未知 cron 任务
crontab -l
ls /etc/cron.d/

一、创建非 root 用户#

Terminal window
# 创建新用户
adduser deploy # 按提示设置密码
usermod -aG sudo deploy # 加入 sudo 组
# 切换到新用户测试 sudo
su - deploy
sudo whoami # 应该输出 root

二、SSH 密钥认证(最重要的单一安全措施)#

2.1 本地生成密钥对#

Terminal window
# 在你的本地机器(Mac/Linux)上执行
ssh-keygen -t ed25519 -C "your-email@example.com" -f ~/.ssh/vps_key
# ed25519 是目前推荐的算法,比 RSA 更安全更短
# 查看公钥(需要复制到服务器)
cat ~/.ssh/vps_key.pub

2.2 将公钥部署到服务器#

Terminal window
# 方法一:ssh-copy-id(推荐)
ssh-copy-id -i ~/.ssh/vps_key.pub deploy@your-server-ip
# 方法二:手动复制(如果 ssh-copy-id 不可用)
# 在服务器上执行:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "粘贴你的公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

2.3 本地 SSH 配置#

Terminal window
# ~/.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 服务配置#

/etc/ssh/sshd_config
# ⚠️ 修改前确保已能用密钥登录!
Port 2222 # 非标准端口(减少扫描机器人攻击)
AddressFamily inet # 仅 IPv4(可选)
# 禁用 root 直接登录
PermitRootLogin no
# 禁用密码登录(只允许密钥)
PasswordAuthentication no
ChallengeResponseAuthentication no
KbdInteractiveAuthentication no
# 只允许指定用户 SSH
AllowUsers deploy
# 安全加强选项
MaxAuthTries 3 # 最多3次尝试
MaxSessions 5
LoginGraceTime 30 # 30秒内完成认证
ClientAliveInterval 300 # 5分钟无操作断开
ClientAliveCountMax 2
# 禁用不必要的功能
X11Forwarding no
AllowAgentForwarding no
AllowTcpForwarding no # 如果不需要 SSH 隧道
PermitTunnel no
PermitEmptyPasswords no
# 密码学强化
KexAlgorithms curve25519-sha256,diffie-hellman-group14-sha256
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
MACs hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com
Terminal window
# 检查配置语法后重启
sshd -t && systemctl restart ssh
# ⚠️ 测试:新开一个终端窗口连接,确保能登录后再关闭当前会话
ssh -p 2222 deploy@your-server-ip

三、UFW 防火墙#

Terminal window
# 安装 UFW(Ubuntu/Debian 通常预装)
apt install ufw -y
# 默认策略:拒绝入站,允许出站
ufw default deny incoming
ufw 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 enable
ufw status verbose
Terminal window
# 常用 UFW 命令
ufw status numbered # 显示规则编号
ufw delete 3 # 删除第3条规则
ufw delete allow 80/tcp # 按规则删除
ufw reload # 重新加载规则
ufw disable # 禁用(保留规则)
ufw reset # 完全重置(清空所有规则)

四、Fail2ban(自动封禁暴力破解 IP)#

Terminal window
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 = true
port = 2222 # 改为你实际的 SSH 端口
logpath = %(sshd_log)s
maxretry = 3 # SSH 更严格:3次失败即封禁
bantime = 86400 # SSH 封禁24小时
[nginx-http-auth]
enabled = true
[nginx-limit-req]
enabled = true
Terminal window
# 启动 Fail2ban
systemctl enable fail2ban
systemctl start fail2ban
# 常用管理命令
fail2ban-client status # 查看所有 jail 状态
fail2ban-client status sshd # 查看 SSH jail 详情
fail2ban-client set sshd banip 1.2.3.4 # 手动封禁 IP
fail2ban-client set sshd unbanip 1.2.3.4 # 手动解封 IP
fail2ban-client banned # 列出所有被封 IP

五、自动安全更新#

Terminal window
apt install unattended-upgrades -y
dpkg-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)#

Terminal window
# 安装 CrowdSec
curl -s https://install.crowdsec.net | sudo bash
apt 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(操作审计)#

Terminal window
apt install auditd -y
systemctl 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-commands
EOF
auditctl -R /etc/audit/rules.d/audit.rules
systemctl restart auditd
# 查询审计日志
ausearch -k user-modify -ts today # 今天对 passwd 的修改
ausearch -k root-commands -ts today # 今天 root 执行的命令
aureport --summary # 总体统计报告

7.2 rkhunter(Rootkit 检测)#

Terminal window
apt install rkhunter -y
# 首次建立基线(安装后立即运行,记录当前干净状态)
rkhunter --update
rkhunter --propupd # 记录文件属性基线
# 日常扫描
rkhunter --check --skip-keypress
# 设置每日自动扫描(/etc/cron.daily/rkhunter)
cat > /etc/cron.daily/rkhunter << 'EOF'
#!/bin/bash
/usr/bin/rkhunter --cronjob --update --quiet
EOF
chmod +x /etc/cron.daily/rkhunter

八、系统内核参数加固#

/etc/sysctl.d/99-security.conf
cat > /etc/sysctl.d/99-security.conf << 'EOF'
# 禁止 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
# 忽略 ICMP ping(可选,防止被扫描发现)
# net.ipv4.icmp_echo_ignore_all = 1
# 防止 IP 欺骗
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# 禁用源路由
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# 防止 ICMP 重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
# 记录可疑数据包
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
# 内核地址不对外暴露
kernel.dmesg_restrict = 1
kernel.kptr_restrict = 2
EOF
sysctl -p /etc/sysctl.d/99-security.conf

九、入侵排查速查#

Terminal window
# ── 检查当前状态 ────────────────────────────────────────────────
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天新建的 .sh
find / -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=running
ls /etc/systemd/system/ # 自定义 service 文件

相关文章

本文基于 Ubuntu 24.04 LTS 编写,Debian 系其他发行版命令基本相同。CentOS/RHEL 系请将 apt 替换为 dnf,防火墙工具替换为 firewalld。安全配置不是一劳永逸的,建议每月检查一次系统日志和安全更新状态。

VPS 服务器安全加固完全指南 2026:SSH 防护 + 防火墙 + Fail2ban + 入侵检测
https://971918.xyz/posts/docs/vps-security-hardening-guide/
作者
九所长
发布于
2026-08-15
许可协议
CC BY-NC-SA 4.0